Это действительно все о передаче сообщений в smalltalk
Я новичок в smalltalk, и меня впечатляет тот факт, что на языке есть только 6 ключевых слов (self, super, true, false, nil и thisContext), и насколько он чист, что имеет почти все как передача сообщений, например. looping using whileTrue, if/else используя ifTrue и т.д., которые отличаются от того, к чему я привык на других языках.
Тем не менее, бывают случаи, когда я просто не могу понять, насколько сообщение действительно подходит, в том числе:
- оператор присваивания
:=
- каскадный оператор
;
- оператор периода
.
- способ создания набора
#( ... )
Это не передача сообщений, правильно?
Ответы
Ответ 1
Как вы обнаружили, существует еще какой-то фактический синтаксис Smalltalk. Конструкция блока, литеральные строки/символы/комментарии, объявление локальной переменной (|...|
) и возврат (^
) - это несколько вещей, которые вы не упомянули, которые также являются синтаксисом.
Некоторые расширения (например, #(...)
, которые обычно создают Array
, а не набор), безусловно, выражаются иначе, например #(1 2 3)
эквивалентно Array with: 1 with: 2 with: 3
; они просто там, чтобы сделать код более удобным для чтения и записи.
Ответ 2
Одна вещь, которая может помочь уточнить: self
, super
, true
, false
, nil
и thisContext
являются примитивами данных, а не ключевыми словами.
Это единственные 6 примитивов данных. Эти 6 также известны как псевдопеременные. Абсолютно все остальное - это экземпляр класса Object или его подклассов.
В Smalltalk очень мало заданных ключевых слов. Они могут быть написаны в очень сжатой форме.
Известный пример Синтаксис Smalltalk на открытке (ссылка)
exampleWithNumber: x
| y |
true & false not & (nil isNil) ifFalse: [self halt].
y := self size + super size.
#($a #a "a" 1 1.0)
do: [ :each |
Transcript show: (each class name);
show: ' '].
^x < y
Здесь комментарий для этого метода - который больше самого метода:
"Метод, который иллюстрирует каждую часть синтаксиса метода Smalltalk кроме примитивов. Он имеет унарные, двоичные и клавиатурные сообщения, объявляет аргументы и временные ряды, обращается к глобальной переменной (но не переменная экземпляра), использует литералы (массив, символ, символ, строка, целое число, float), использует псевдо переменные true, false, nil, self и super и имеет последовательность, назначение, возврат и каскад. Он имеет как нулевой аргумент, так и один аргумент.