http://www.aqee.net/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'

运行的效果会是这样:

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: #MyClassinstanceVariableNames: ''classVariableNames: ''poolDictionaries: ''category: 'Pupeno'

注意,一个类的创建是通过向其它类发送消息—包括名字和一些参数,告诉它我要继承它。这是一个消息,跟其它类型的方法调用一样。对象是类,类也是对象。Smalltalk的对象模式非常的优雅,但这是另外一个 话题。

现在我们有了一个类,我们来创建一个方法,叫做greet:就在这个类里。

greet: name"Greets the user named name"| message |message := 'Hello ', name.Transcript show: message.

在方法定义里,首先我们给这个方法加了一个注释,然后是管道 (“|”)包着的本地变量,然后是方法的实现,我把”Hello“放到了变量message里,然后用逗号符把它和变量name连接起来。然后我把它发送到Transcript里。

运行起来的结果像这样:

好了,我们来用一用它:

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: #PBooleaninstanceVariableNames: ''classVariableNames: ''poolDictionaries: ''category: 'Pupeno'PBoolean subclass: #PTrueinstanceVariableNames: ''classVariableNames: ''poolDictionaries: ''category: 'Pupeno'PBoolean subclass: #PFalseinstanceVariableNames: ''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。我们已经接近目标了,但还不是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就是这样实现的:

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

Smalltalk 介绍相关推荐

  1. Ruby中的设计模式——《松本行弘的程序世界》

    < 设计模式 > 一书是用C++ 和 Smalltalk 介绍模式实例的.看了那些例子,大家都会感觉到,绝大多数的模式用 Smalltalk 实现起来非常简单.这是为什么呢? 因为Smal ...

  2. smalltalk语言介绍语法简单总结

    参考:https://www.jianshu.com/p/0aac0ba06808 最近在学习Object C,Object C很多特性继承了smalltalk语言的特性,所以先了解一下smallta ...

  3. Django介绍和虚拟环境(django特点、MVC、MVT、Django学习资料)

    MVT流程: 创建Django项目和应用 django-admin startproject name python manager.py startapp name 视图和ULR 视图的请求和响应 ...

  4. 计算机专业英语外文翻译,计算机专业英语JAVA介绍外文翻译[共28页]

    <计算机专业英语JAVA介绍外文翻译[共28页]>由会员分享,可在线阅读,更多相关<计算机专业英语JAVA介绍外文翻译[共28页](28页珍藏版)>请在读根文库上搜索. 1.荆 ...

  5. Django介绍工程搭建

    Django介绍 1. 简介 Django,发音为[`dʒæŋɡəʊ],是用python语言写的开源web开发框架,并遵循MVC设计.劳伦斯出版集团为了开发以新闻内容为主的网站,而开发出来了这个框架, ...

  6. Python 语言介绍

    本节目录: 一.编程语言介绍 二.python解释器介绍 三.安装python解释器 四.运行python程序的两种方式 五.变量 六.后期补充内容 一.编程语言介绍 1.机器语言: 直接用二进制编程 ...

  7. Python的介绍与安装

    2019独角兽企业重金招聘Python工程师标准>>> 1.Python的介绍 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具 ...

  8. Thirft框架介绍

    http://dongxicheng.org/search-engine/thrift-framework-intro/ 1.前言 Thrift是一个跨语言的服务部署框架,最初由Facebook于20 ...

  9. Python介绍与特点(自学python知识整理)

    Python介绍与特点(自学python知识整理) Python 简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计: Python 是一种解释 ...

最新文章

  1. 文件夹目录结构导出工具及下载
  2. Nandflash 驱动移植
  3. 学习C++之父的最新姐妹作笔记2
  4. 需求评审五个维度框架分析及其带来的启示-3-典型需求评审
  5. flask框架数据库增删改查
  6. 【sklearn学习】降维算法PCA和SVD
  7. ABP框架 v3.0 已发布!
  8. 开发函数计算的正确姿势 —— 安装第三方依赖
  9. 理解 Delphi 的类(十) - 深入方法[2] - 参数分割
  10. 普通机器学习模型的提升
  11. github note
  12. 在 java 中_关于final 关键字,在Java中,关于final关键字的说法正确的是()
  13. html网页使用js连接mysql_html下利用javascript连数据库
  14. presscad图层LIsp_PressCADLisp程序说明
  15. scratch少儿趣味编程之让小猫原地转圈
  16. 求两个数的最大公约数和最小公倍数
  17. NOIP 2016 滚粗记
  18. ZABBIX 3.0 使用详解
  19. SAP中采购订单修改触发重新审批的相关控制逻辑及测试
  20. React之ref的高阶用法

热门文章

  1. 甲醛排放、电器辐射… 如何去除家中“隐患”
  2. string类的大小
  3. 四轴飞行diy全套入门教程(从最基础的开始) 导线的知识入门(细节决定内涵)
  4. 「数据分析入门」某在线教育机构经营分析
  5. 滚珠丝杠与滚柱丝杠区别
  6. 什么是staging server
  7. 中国移动手机定位lbs接口协议讲解及java代码实现_Lbs定位功能的实现
  8. vue右键在新标签页中打开链接(a标签跳转路由)
  9. CKA中国区线下考试报名指南
  10. c语言方括号中写负数,c语言方括号的用法