为什么我喜欢Smalltalk?

http://www.vaikan.com/why-i-love-smalltalk/

C,C++,Python等,这些算是传统的语言吧,我从这些语言上学会了基本的编程技术。这之后,又有四种语言,它们让我学到了一些新的东西。这些语言改变了我思考的模式,虽然我从来没有使用过它们,但它们都是绝对值得你学习一下的。它们是:
Smalltalk
Lisp
Erlang
Haskell

你也许还会把Prolog加入这个列表中,但我没有学过Prolog。本文是关于Smalltalk这种语言的。

我的目的并不是教大家怎么使用Smalltalk,而是向你展示一些Smalltalk能做到、而其它语言做不到的一些事情(声明:有些语言也能做到,它们都是Smalltalk的一些方言)。不用说,我需要向你先介绍一下这种语言的一些基本知识,之后我才能向你展示更有价值的东西,那么就开始吧,第一个程序:
1 + 1
很显然,计算的结果是2.如果你想把它存到一个变量里,这样做:
m := 1 + 1
句子都要以点号(句号)结尾,像这样:
m := 1.m := m + 1
Squeak——这是Smalltalk语言的一种版本实现——里,有一个对象叫做Transcript,你把消息发送给它,它能把消息显示到屏幕上。它很像一个Log窗口。你要这样去用它:
Transcript show: 'Hello world'
运行的效果会是这样:
[图片上传中。。。(1)]
Smalltalk的这种语法非常的独特。消息(message)——这在其它语言里也叫做“方法”——是show:
(包括冒号),它接受一个参数。我们用下面的写法可以让这个句子运行10遍:
10 timesRepeat: [ Transcript show: 'Hello world']
现在你开始能看出Smalltalk的独特之处了。我把消息timesRepeat:
发送到对象“10”——一个Integer
类。这N次的循环操作是由这个Integer
来执行的,你认真想想,其实很有道理。
第二个有趣的部分是代码段落(block),是在方括号里面的部分。你可能认为它跟其他种语言里的代码段落语法是同样的道理,比如Java的:
for(int i=1; i<11; i++) { System.out.println("Hello world");}
但你要是从Smalltalk的视角来看,你会发现它强大的多。它实际上是个闭包(closure)。看这段:
t := [ Transcript show: 'Hello world']
现在,我有了一个叫做t
的变量,它的类型是BlockClosure
,通过这个变量,我可以做我想做的任何事情。如果我向它发送class
消息,它会返回它的class类型:
t class
如果我向它发送value
消息,它会运行,会在Transcript里留下“Hello World”字符:
t value
让我们多看几段程序。一个没有任何参数的消息:
10 printString
带有一个参数的消息:
10 printStringBase: 2
带有两个参数的消息:
10 printStringBase: 2 nDigits: 10
很可爱,不是吗?这个方法叫做printStringBase:nDigits:
。我没在其它地方见过这样的语法;只有Objective-C是个例外,因为它是从Smalltalk承袭过来的。
小玩意已经说的不少了,现在说点复杂点儿的东西。我们来创建一个类:
Object subclass: #MyClass instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Pupeno'
注意,一个类的创建是通过向其它类发送消息—包括名字和一些参数,告诉它我要继承它。这是一个消息,跟其它类型的方法调用一样。对象是类,类也是对象。Smalltalk的对象模式非常的优雅,但这是另外一个 话题。
现在我们有了一个类,我们来创建一个方法,叫做greet:就在这个类里。
greet: name "Greets the user named name" | message | message := 'Hello ', name. Transcript show: message.
在方法定义里,首先我们给这个方法加了一个注释,然后是管道 (“|”)包着的本地变量,然后是方法的实现,我把”Hello“放到了变量message里,然后用逗号符把它和变量name连接起来。然后我把它发送到Transcript里。
运行起来的结果像这样:

MyClass greet method

好了,我们来用一用它:
m := MyClass new.m greet: 'Pupeno'
为了创建一个类MyClass
的对象,我们向这个类发送new
消息。这个new
并不是像Java里的关键字。new
是一个方法。你可以看它的源代码,覆盖它,等等。不要动它,除非你十分清楚你在做什么。
事实上,如果你想一下,你会发现我们没有看到任何的关键字。看看我们写过的这些代码,没有什么要记住的关键字!更重要的,目前为止,你已经基本的认识Smalltalk了。Smalltalk就是这些,但就像是一个小积木块,这些小块能让你搭建出你想要的任何东西。
不错,就这些,我要说的就这些。我们看到了,Smalltalk里没有循环,它有整数类,这个类里实现了timesRepeat:
消息,可以用来把事情重复执行N次。像这样用于循环操作的方法到处都是。
你会问,有没有if
这个关键字?Smalltalk里肯定有一个if
关键字,不是吗?不,没有。你所谓的if
语法在Smalltalk里可以用你刚才看到的类和消息传递的机制实现。为了好玩,我们来实现一个。
我们从创建一个PBoolean
类开始,然后两个继承它的类——PTrue
和 PFalse

Object subclass: #PBoolean instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Pupeno'PBoolean subclass: #PTrue instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Pupeno'PBoolean subclass: #PFalse instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Pupeno'
我们之前创建了一个类,MyClass,我们要给它定义一个equals:
方法,它能返回true和false,也就是我们的PTrue
和 PFalse

equals: other ^ PTrue new
这个小帽子,^
,是返回的意思。我写的是硬编码让它返回true。现在我们可以在程序来用它了:
m1 := MyClass new.m2 := MyClass new.m1 equals: m2
得到的是true。我们已经接近目标了,但还不是if
。if
应该是个什么样子?它的样子应该是这样:
m1 := MyClass new.m2 := MyClass new.(m1 equals: m2) ifTrue: [ Transcript show: 'They are equal'; cr] else: [ Transcript show: 'They are false'; cr]
估计你在想,怎么才能实现这样的效果。我在PTrue
里加入了一个方法:
ifTrue: do else: notdo ^ do value
这个方法看上去是接受2个参数,但执行时接受第一个,忽略第二个。对于PFalse
,正好相反:
ifTrue: notdo else: do ^ do value
这就可以了。一个可以用的if
!如果让我说,我觉得这真的很神奇。如果你去检查Squeak了的代码,你会发现它里面的if
就是这样实现的:
True's ifTrue:ifFalse:

如果你使用的编程语言能允许你创建像if条件这样的基本功能,那它就可以让你创建任何你想要的东西。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容