Smalltalk экзотические особенности - PullRequest
4 голосов
/ 26 июня 2010

Синтаксис Smalltalk (и его функции) может показаться довольно экзотическим (и даже беспокоящим), когда вы пришли из мира C-подобных синтаксисов.Я потерял время, потратив немного времени на
. Мне было бы интересно узнать, зная, что вы находите действительно экзотическим, по сравнению с более классическими / основными языками, и что, по вашему мнению, помогает понять язык.

Например, оценка слогические операторы:

  • (object1 = object2) & (object3 = object4): при этом будет оцениваться все выражение, даже если левая часть ложна, остальные будут оцениваться.
  • (object1 = object2) and: [object3 = object4]: при этом будет оцениватьсялевая часть, и оценивает правую часть, только если первая верна.

Ответы [ 5 ]

10 голосов
/ 27 июня 2010

Все является объектом, и все, что находится выше виртуальной машины, доступно для проверки и модификации. (Примитивы являются частью виртуальной машины, по крайней мере, концептуально.) Даже ваш стек вызовов доступен (thisContext) - Seaside реализовал продолжения назад, просто перевернув стек вызовов в поток и восстановив его (возвращаясь к продолжению ) просто считывая кадры активации из этого потока!

Вы можете создать селектор из строки, превратить его в Symbol и отправить его в виде сообщения: self perform: 'this', 'That' сделает то же самое, что и self thisThat. (Но не делайте этого, по тем же причинам, по которым вы должны избегать eval как на Лиспе, так и в PHP: очень трудно отлаживать!)

Передача сообщений: это не вызов метода !

#become:, вероятно, будет шоком для любого, кто не видел его раньше. (tl; dr оптовая замена двух указателей объекта - все ссылки на B теперь указывают на A, а все ссылки на A теперь указывают на B)

4 голосов
/ 28 ноября 2012

Как насчет выборочной точки останова (которую я иногда использую):

foo
    thisContext sender selector == #bar ifTrue:[ self halt ].
    ...

будет отлаживаться сам, но только если вызывается из bar.Полезно, если foo вызывается из zillion других мест, и обычная точка останова срабатывает слишком часто.

4 голосов
/ 01 сентября 2010

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

Подумайте об этом:

Что такое класс 'This is a string'?Ну, что-то типа String.

Что такое класс String?String class.Примечание: это класс, но у него нет имени, он просто печатает себя как 'String class'.

Что такое класс String class?Metaclass.Примечание: это именованный класс.

Что такое класс Metaclass?Как и следовало ожидать (или нет), это Metaclass class.Из которых, как и следовало ожидать, класс снова равен Metaclass.

Это первый круг.Другой, который я сначала нашел довольно эзотерическим (конечно, теперь я ем метаклассы на завтрак), следующий:

Что такое суперкласс String?Object (в конце концов, разные реализации Smalltalk имеют разные иерархии классов этих базовых классов).

Что такое суперкласс Object?nil.Теперь это интересный ответ в Smalltalk, потому что это на самом деле объект!nil class ответов UndefinedObject.Из которых суперкласс - это ... Object.

Навигация по суперклассу и установлению отношений была для меня настоящей поездкой на роликах в те дни ...

4 голосов
/ 26 июня 2010

Primitves

someMethod
  <primitive 14122 wtf>
  "fail and execute the following"
  [self] inlineCopyInject: [:t1 | self].
3 голосов
/ 02 сентября 2010

Я всегда любил квинту Smalltalk:

quine
     ^thisContext method getSource

(версия Pharo.)

...