Это действительно все о передаче сообщений в 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 и имеет последовательность, назначение,             возврат и каскад. Он имеет как нулевой аргумент, так и один аргумент.