2010-06-26 49 views
4

當你來自更類似C語法的語法世界時,可以發現Smalltalk語法(和功能)非常奇特(甚至令人不安)。我發現自己失去了一些時間
我會有興趣學習知道你發現真正異國情調,而不是比較經典/主流語言,並且你認爲有助於理解語言。Smalltalk奇特功能

例如,評價與邏輯運算符:

  • (object1 = object2) & (object3 = object4):這將評估整個表達式,即使左部分是假的,其餘的將被評估。
  • (object1 = object2) and: [object3 = object4]:這將評估左側部分,並且只有在第一個爲真時評估正確部分。
+1

這是什麼異國情調?根據發送消息來思考。你在一個充滿人的房間裏,我也是;我想問你一個問題,所以我張開嘴,開始說話。你收到這些話,並作出相應的反應。要麼忽視它們,要麼迴應它們,要麼表達一些身體表達來傳達迴應。當你停下來思考它的目的是什麼時,它實際上比基礎更具基礎性。 – jer 2010-06-26 18:56:55

+0

正如我所說的,當我說「異國情調」時,它的意思是「與經典/主流C/Java類語言相比」。我同意發送消息使得SmallTalk比其他語言更接近人類思維,但我們(程序員,或者至少我)格式化爲在C世界中思考。這只是我的觀點。 – 2010-06-26 19:06:34

+0

從Delphi背景來看,我習慣了基於編譯器開關的布爾表達式,這些布爾表達式可能會或可能不會以任何方式進行評估!關於&和'and'的 – 2010-06-26 19:34:28

回答

4

Primitves

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

一切都是對象,一切之上的虛擬機可用於檢查和修改。 (原語至少在概念上是虛擬機的一部分。)即使您的調用堆棧可用(thisContext) - Seaside只需將調用堆棧調入流中,然後通過將其恢復(返回繼續)只需從該流中讀出激活幀即可!

您可以從一個字符串構造一個選擇器並將其轉換爲一個Symbol並將其作爲消息發送:self perform: 'this', 'That'將執行與self thisThat相同的操作。 (但是不要這樣做,出於同樣的原因,您應該避免在Lisp和PHP中使用eval:非常難以調試!)

消息傳遞:它是not method invocation

#become:對於以前沒有見過它的人來說可能有點震驚。 (tl; dr批量交換兩個對象指針 - 現在所有對B的引用指向A,並且現在對A的所有引用都指向B)

4

我與Smalltalk的第一次摔跤會議是元類實現。

考慮一下:

什麼是類的'This is a string'?那麼,像String

String是什麼類? String class。注意:這是一個類,但它沒有名字,它只是將自己打印爲'String class'。

什麼是String classMetaclass。注意:這是一個命名的類。

什麼是Metaclass的等級?正如你所期望的(或不),這是Metaclass class。其中,正如你所期望的那樣,班級又是Metaclass

這是第一個循環。另一個我最初發現相當深奧的(當然,現在我早餐吃元類)是下一個:

什麼是String的超類? (最終,Smalltalk的不同實現具有不同的這些基本類的類層次結構)。

什麼是Object的超類? nil。現在這在Smalltalk中是一個有趣的答案,因爲它實際上是一個對象! nil class答案UndefinedObject。其中超級... Object

通過關係的父類和實例導航是在那些日子裏真正rollercoster騎我...

+0

在Squeak中,'Object'的子類'ProtoObject',子類'nil'。 'nil'是'UndefinedObject',子類'Object'。你的觀點仍然存在:) – 2010-09-01 13:30:27

+0

還有另外一個地方可以看看: 什麼是Object類的超類... – blabla999 2012-11-28 11:44:14

3

我一直喜歡Smalltalk的奎因:

quine 
    ^thisContext method getSource 

(菲羅版本。)

4

如何選擇設置斷點(我實際使用的時間):

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

會自行調試,但只有從bar調用時纔會調試。有用的,如果foo從其他地方被調用,並且經常出現斷點太頻繁。