Это действительно все о передаче сообщений в smalltalk - PullRequest
14 голосов
/ 12 апреля 2011

Я новичок в smalltalk и впечатлен тем фактом, что в языке всего 6 ключевых слов (self, super, true, false, nil & thisContext), и насколько он чист, имея почти все как передача сообщений, например. зацикливание с использованием whileTrue, if / else с использованием ifTrue и т. д., которые сильно отличаются от того, к чему я привык в других языках.

Тем не менее, есть случаи, когда я просто не могу понять, насколько действительно подходит передача сообщений, к ним относятся:

  • оператор присваивания :=
  • каскадный оператор ;
  • оператор периода .
  • способ создания набора #( ... )

Это не передача сообщений, верно?

Ответы [ 2 ]

13 голосов
/ 12 апреля 2011

Как вы обнаружили, все еще существует некоторый синтаксис Smalltalk.Построение блока, буквенные строки / символы / комментарии, объявление локальной переменной (|...|) и возвращение (^) - это несколько вещей, которые вы не упомянули, а также синтаксис.

Некоторые расширения (например,#(...), который обычно создает Array, а не набор), безусловно, выражаются иначе, например, #(1 2 3) эквивалентно Array with: 1 with: 2 with: 3;они просто для облегчения чтения и записи кода.

2 голосов
/ 16 ноября 2015

Одна вещь, которая может помочь уточнить: self, super, true, false, nil & thisContext являются примитивами данных, а не ключевыми словами.

Это единственные 6 примитивов данных. Эти 6 также известны как псевдопеременные . Абсолютно любая другая вещь является экземпляром Class 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 кроме примитивов. Он имеет одинарные, двоичные и клавиатурные сообщения, объявляет аргументы и временные значения, обращается к глобальной переменной (но не переменная экземпляра), использует литералы (массив, символ, символ, строка, целое число, число с плавающей точкой), использует псевдопеременные true, false, nil, self и super, и имеет последовательность, присваивание, возврат и каскад. Он имеет как нулевой аргумент, так и один аргументный блок. "

...