【外刊IT评论网】为什么我喜欢Smalltalk?

标签: 技术技巧 Smalltalk | 发表时间:2011-09-16 00:33 | 作者:Aqee ndv
出处:http://www.aqee.net
本文是从 Why I love Smalltalk 这篇文章翻译而来。

Smalltalk logo

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'

运行的效果会是这样:

Squeak transcript showing the result of Transcript show: 'Hello World'

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类开始,然后两个继承它的类——PTruePFalse

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,也就是我们的PTruePFalse

equals: other
  ^ PTrue new

这个小帽子,^,是返回的意思。我写的是硬编码让它返回true。现在我们可以在程序来用它了:

m1 := MyClass new.
m2 := MyClass new.
m1 equals: m2

得到的是true。我们已经接近目标了,但还不是ifif应该是个什么样子?它的样子应该是这样:

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条件这样的基本功能,那它就可以让你创建任何你想要的东西。


本文来自外刊IT评论网(www.aqee.net),原始地址:为什么我喜欢Smalltalk?

相关 [it 我喜欢 smalltalk] 推荐:

【外刊IT评论网】为什么我喜欢Smalltalk?

- ndv - 外刊IT评论网
本文是从 Why I love Smalltalk 这篇文章翻译而来. C,C++,Python等,这些算是传统的语言吧,我从这些语言上学会了基本的编程技术. 这之后,又有四种语言,它们让我学到了一些新的东西. 这些语言改变了我思考的模式,虽然我从来没有使用过它们,但它们都是绝对值得你学习一下的. 你也许还会把Prolog加入这个列表中,但我没有学过Prolog.

为什么我喜欢Java

- - ImportNew
我现在的老板使用一个在线测试系统来筛选在线申请职位的求职者. 测试的第一个问题很浅显,仅仅是为了让求职者熟悉一下这个系统的提交和测试代码的流程. 问题是这样的,写一个将标准输入拷贝到标准输出的流程. 求职者可以使用任何他们喜欢的编程语言来实现这个程序. 有时候我们也会遇到在这个测试中得零分的求职者.

我喜欢的那些演奏现场

- huitang - 每日鲜果精选
3.喜多郎 《heaven and earth》. 4.喜多郎 《Theme From Silk Road 》. 5.久石让 《the rain》. 我钟爱的风笛版《Amazing grace 》. 9.雅尼 《Reflection of Passion》. 查看详情评论:我喜欢的那些演奏现场. 本文原始链接:http://www.u148.net/article/26270.html.

我喜欢的几款软件(三)

- - GeoWHY
好几年前,我就用过这款软件,后来因为自己只有半个摩羯座(玩笑)的严谨和自律,最终不了了之了. 其实,对于时间管理和任务提醒,想我这样没有iphone,使用这nokia 120块钱的低端机的人,最好的办法是用本子记. 纸笔永远是最好的,在我看来,可我每天盯着电脑那么多小时,大部分时间用电脑比用纸笔多,使用一个list软件还是有点必要的.

那些我喜欢的动画片们(一)

- baldachin - 有意思吧
不得不说,动画片真的很好看,那些觉得看动画片还会哭很幼稚的人们,果断忽略. 我只能说,黑白的画面,竟然能让人真的感到恐惧,那些快到结束时,出现的黑白条,真的很美. 虽然看了很多遍,没有怎么看懂,但是,很值得看的动画片哦. 画面很漂亮,里面的歌很好听,尤其是那段砸青蛙,全部的青蛙宴. 看了有点小心酸,阿婆的执着,孩子的梦想,感觉很舒服的动画片.

那些我喜欢的动画片们(二)

- baldachin - 有意思吧
继续和大家讨论好看的动画片,有喜欢的动画片,大家都来说说哈. 宫崎骏的动画片,大家都是一致认可的吧. 其实,就我个人而言,比较喜欢像电影的短小动画片,但是也有一些喜欢的中长篇动画片. 总觉得动画片,能给人很深的感悟,很多道理,能让人豁然开朗好多. 不是电影《魔术师》,是动画片《魔术师》,虽然电影的也很好看,尤其是哪个结局很意外.

【外刊IT评论网】为什么我喜欢Lisp语言

- EK - 外刊IT评论
本文是从 Why I love Lisp 这篇文章翻译而来. 这篇文章是我在Simplificator——我工作的地方——的一次座谈内容的摘录,座谈的题目叫做“为什么我喜欢Smalltalk语言和Lisp语言”. 在此之前,我曾发布过一篇叫做“ 为什么我喜欢Smalltalk. 大漠黄沙 by Guilherme Jófili.

【外刊IT评论网】为什么我喜欢富于表达性的编程语言

- 洋白菜 - 外刊IT评论
本文是从 My love… for Expressive Programming Languages 这篇文章翻译而来. 我的编程之旅从少年时代就开始了,那时学的是GW-BASIC. 很快,我学习了C语言,之后是C++. C++里提供的面向对象的语法结构让我印象深刻,但是,对于有些像定义范围控制的概念我还是觉得有些复杂.