": = "и приоритет двоичных сообщений в Smalltalk


Я пытаюсь изучить Smalltalk с помощью учебных пособий, включенных в Dolphin Smalltalk X6.

Мой вопрос касается оценки выражений с несколькими сообщениями.

Насколько я понимаю, сначала оцениваются простые сообщения, затем двоичные сообщения и, наконец, сообщения с ключевыми словами (за исключением кода в скобках). Однако у меня возникли проблемы с применением этого понимания ко второй строке в следующем примере (найденном в Dolphin Smalltalk учебное пособие ).
    playground := Playground new.
    teresa := playground add: Triangle new.       "Misunderstood code"
    teresa class.                                 "Evaluates to 'Triangle'"

Если бы мое понимание было правильным, то 2-я строка оценивалась бы так:

    1. Simple message 'new' sent to Triangle, triangle object as response
    2. Binary message ':=' with parameter 'playground' sent to 'teresa'.
    3. Keyword message 'add:' with parameter 'triangle object' sent to 'teresa'.
    4. teresa class. "evaluates to 'Playground'".
Мое непонимание заключается в том, как "Тереза" относится к анонимному объекту треугольника, а не к объекту игровой площадки, на который ссылается "игровая площадка". Я искал второе объяснение оценки Smalltalk для упоминаний := или add: будучи частными случаями без успеха, и единственное другое объяснение, которое я могу придумать, - это фундаментальное недоразумение.

Кто - нибудь может помочь мне выпрямиться?

2 4

2 ответа:

While: = выглядит как двоичное сообщение, потому что в нем используются символы инфикса... это не. Это часть синтаксиса языка точно так же, как парены и точки (например).

Думайте о := как об операторе присваивания (иногда говорят как "получает"). Это не сообщение какого-либо приоритета. Он оценивается после отправки любого сообщения. Это значение lvalue должно быть прямой ссылкой на переменную (а не результатом отправки сообщения).

Оператор присваивания (:=) не является сообщением. (Он не передается объекту, вместо этого он указывает, что переменная должна быть установлена в значение). Его приоритет-последний общий.

Итак, что происходит:

  1. простое сообщение " new " отправить в треугольник, объект треугольника в качестве ответа
  2. ключевое слово message add: отправлено на игровую площадку, и есть соглашение, которое добавляет: сообщения отвечают на добавленный объект, которому этот объект, кажется, следует, поэтому вновь созданный треугольник возвращенный.
  3. переменная Тереза устанавливается в новый треугольник
  4. класс Терезы. "оценивает в треугольник".