2013-03-06 5 views
4

Я пытаюсь изучить Smalltalk через учебные пособия, входящие в состав Dolphin Smalltalk X6.«: =» и приоритет двоичных сообщений в Smalltalk

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

Я понимаю, что сначала обрабатываются простые сообщения, затем двоичные сообщения и, наконец, сообщения ключевых слов (за исключением кода в скобках). Тем не менее, у меня возникли проблемы с применением этого понимания ко второй строке в следующем примере (см. Dolphin Smalltalk tutorial).

playground := Playground new. 
    teresa := playground add: Triangle new.  "Misunderstood code" 
    teresa class.         "Evaluates to 'Triangle'" 

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

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'". 

Мое непонимание в том, как «Teresa» приходит, чтобы обратиться к объекту анонимного Triangle, а не объект площадка называется к «игровой площадке».

Я искал второе объяснение оценки Smalltalk для упоминания о: = или добавлении: быть особыми случаями без успеха, и единственное другое объяснение, о котором я могу думать, является фундаментальным недоразумением.

Любая помощь выпрямляет меня?

ответ

7

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

Подумайте: = как оператор присваивания (иногда говорят как «получает»). Это НЕ сообщение какого-либо приоритета. Он оценивается ПОСЛЕ любых сообщений. Это lvalue ДОЛЖНО быть ссылкой на прямую переменную (а не результаты отправки сообщения).

8

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

Так что же происходит:

  1. Простого сообщения «новые» отправить треугольник, треугольник объект, как ответ
  2. сообщения ключевого слова добавить: отправленный на детскую площадку, и есть соглашение, что добавить: сообщения ответа на объекте добавлено, что, похоже, следует, так что возвращается новый треугольник.
  3. Переменная teresa установлена ​​в новый треугольник
  4. teresa класс. «оценивается треугольником».
+0

задается вопросом, почему: = это не сообщение в Smalltalk. Почему бы не заставить переменные получать: =? – Hendekagon

+1

Поскольку переменная является фактически указателем на объект, это не сам объект. Сообщения отправляются объекту, на который указывает переменная, тогда как оператор: = меняет объект, на который указывает переменная. –

+0

hmm указатели объектов не являются объектами, поэтому они не могут получить: = (или pointTo: anObject, или →) – Hendekagon

 Смежные вопросы

  • Нет связанных вопросов^_^