В JS и пистоне (в которых первоклассные функции) аргументы всегда выполняются, объект не имеет над ними контроля. А это не отвечает требованию о том, что объект сам волен решать, как ему поступать с пришедшим сообщением.
Еще раз для дебилов - в JS и пистоне никто не мешает тебе вызвать на объекте евал. Хочешь -вычисляй, не хочешь - не вычисляй. Разница в том, что в жс/пистоне ты можешь передать «2+2», а можешь передать 2+2. В ИО только первый вариант. Второго варианта разработчики тебя лишили.
В моем примере ничего не передается. там посылается собщение object message1(message2). Это фэкспры, выражаясь лисп-языком, но мощней, так как добавляется еще и ооп-style. Можно это все квотированием или строками имитировать, да, но мозг сломаешь парсить, что где вычисляется в какой момент, евалить, квотить, это будет говно, а не код. А если так все просто, то и никакие if'ы в языках были бы не нужны, пиши везде eval/quote, никто не запрещает.
m1 := method(expr,
writeln("I don't know, what message I has received, but value is " .. expr) // "fake-oop" semsntics
)
m2 := method(
args := call message arguments
writeln("message " .. args at(0) .. " evaluates to " .. doMessage(args at(0)) .. " in messanger's context")
)
m1(1 + 2) // pass value of expression
m1("1 + 2") // pass string as value, same shit
m2(1 + 2) // send message
//I don't know, what message I has received, but value is 3
//I don't know, what message I has received, but value is 1 + 2
//message 1 +(2) evaluates to 3 in messanger's context
константа это code point. А осмысленные символы могут состоять из более чем одного code point-а.
Однако, если речь идет о буквах европейских языков, то в нормализованной форме «композиция» все они представляются одним code point, так что тупая замена работает