Smalltalk异域风情

时间:2010-06-26 18:53:29

标签: smalltalk

当你来自一个更像C语法的语法世界时,可以发现Smalltalk语法(和特性)非常奇特(甚至令人不安)。我发现自己失去了一些时间 与更经典/主流的语言相比,我有兴趣学习你所发现的异域风情,并且你认为有助于理解语言。

例如,使用逻辑运算符进行评估:

  • (object1 = object2) & (object3 = object4):这将评估整个表达式,即使左侧部分为假,其余部分也将进行评估。
  • (object1 = object2) and: [object3 = object4]:这将评估左侧部分,只有在第一部分为真的情况下才会评估正确的部分。

5 个答案:

答案 0 :(得分:10)

一切都是对象,虚拟机上方的所有东西都可用于检查和修改。 (至少在概念上,基元是虚拟机的一部分。)即使你的调用堆栈可用(thisContext) - Seaside通过简单地将调用堆栈调入流中并恢复它来恢复它(返回到当天)简单地从该流中读出激活帧!

您可以从字符串构建选择器并将其转换为Symbol并将其作为消息发送:self perform: 'this', 'That'将执行与self thisThat相同的操作。 (但是不要这样做,出于同样的原因,你应该避免在Lisps和PHP中使用eval:很难调试!)

消息传递:它是not method invocation

#become:对于之前没见过的人来说可能有些震撼。 (tl; dr批量交换两个对象指针 - 所有对B的引用现在都指向A,所有对A的引用现在都指向B)

答案 1 :(得分:4)

Primitves

someMethod
  <primitive 14122 wtf>
  "fail and execute the following"
  [self] inlineCopyInject: [:t1 | self].

答案 2 :(得分:4)

我与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

在那些日子里,通过超级阶段和关系实例导航对我来说是一个真正的过山车...

答案 3 :(得分:4)

选择性断点(我实际上有时使用它)怎么样:

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

将自行调试,但仅限于从bar调用。有用的,如果从其他地方召唤foo并且经常会遇到常规断点。

答案 4 :(得分:3)

我一直都喜欢Smalltalk quine:

quine
     ^thisContext method getSource

(Pharo版本。)