第一范文网 - 专业文章范例文档资料分享平台

Smalltalk 超简明教程

来源:用户分享 时间:2020-06-24 本文由揉脸萌态 分享 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

Smalltalk 超简明教程

Simberson公司的David Buck 撰写的此文档是为C/C++/C#/Java 程序员介绍Smalltalk 的,而且已经得到他善意的许可而得以发布。如果你对正式的培训有兴趣请联系Simberson,咨询Smalltalk 培训。

我听说很多Java 和C#程序员说他们看不懂Smalltalk 代码。Smalltalk 因为只有很少的语法,所以实际上它非常的简单。Smalltalk 的强大之处是它的环境和类库。 本文意图通过代码对比,使Java 和C#程序员迅速理解Smalltalk。

Copyright David Buck 2005

● 临时变量 Smalltalk 不需要变量的类型声明。临时变量通过两个竖线来定义 Java Smalltalk int a; char b; float c;

● 赋值 Smalltalk 使用:= 赋值 Java a = 5;

● 消息 Smalltalk 有三种消息 类型 一元运算符 二元运算符 关键字 连接符 形式 以小写字母开始的字符和数字 0 1 参数 squared + do:,between: and: 例子 a := 5 | a b c | Smalltalk 使用多个冒号终结文字和数字字符 1或者多个 传输一个或多个参数时,需要使用关键字消息。每一个参数前面需要添加关键字。 Smalltalk不使用{}和;分割参数。 例子: Java myAccount.getBalance(); myAccount.setBalance (10); myAccount.transfer(20,anotherAccount) myAccount.equals (anotherAccount);

Smalltalk myAccountgetBalance myAccountsetBalance: 10 myAccount transfer: 20 to:anotherAccount myAccount = anotherAccount ● 运算优先级: 一元运算符 (首先运算) 二元运算符 (其次运算) 关键字 (最后运算) 在同等优先级下,运算是从左到右 Java 3 + 5 * 6 //答案是33 注意Smalltalk 版本,这个表达式实际上是两个消息: 消息1 接受者:3 消息: + 参数:5 结果: 8

消息2

接受者: 8 消息: * 参数: 6 结果:48

● 语句 Smalltalk 使用句号分割语句。最后一条语句不需句号。 Java Smalltalk 3 + 5 * 6 “答案是:48” Smalltalk myAccount.deposit(20); myAccount deposit: 20. myAccount.transfer(20,anotherAccount); myAccount transfer: 20 to:anotherAccount ● 常量 Smalltalk 中整数类型,字符类型,字符串类型,布尔类型,浮点数类型和双精度浮点数类型都是头等类对象。整数类型是无限精度的,会按需自动增长,而不会溢出(译者注:跟内存大小有关)。 实际上,Smalltalk 中没有char 类型,byte 类型,short 类型,int类型或者long 类型的相对应的类型。它们都是整数类型。 Java Smalltalk 5 01230 0x7f <无对应物> 200L 2e-5 2e-5d 'h' '\Ω' \\

5 8r1230 16r7f 3r21012 (你可以选择你想用的基数) <无对应物> 2e-5 2d-5 $h Character value: 16r3A9 'hello' 'can''t' ● 特定词 Smalltalk 中,nil 引用一个真实的对象,它是UndefinedObject类的实例。true 是True类的实例,flase是Flase类的实例 Java Smalltalk this null true false super base (C#) ● 方法返回 Java return value; ● 级联 Java <无对应物> ● 注释 Java /* comment */ // another comment ● 实例创建 Smalltalk 中,类是真实的对象。创建实例,只需向class 发送new。针对类的方法称为类方法(类似于Java 的static methods)。 Java Smalltalk new Reservation(); ● 构造函数 Smalltalk 没有构造函数。如果你想执行实例初始化,你可以重定义“new”类方法来初始化实例。 Java Smalltalk Reservation() { startTime = new GregorianCalendar().getTime(); endTime = new GregorianCalendar().getTime(); }

Reservation class methods: new ^super new initialize Reservation instance method: initialize startTime := Timestamp now. endTime := Timestamp now Reservation new \ Smalltalk Smalltalk myAccount deposit: 20; transfer: 20 to: anotherAccount ^value Smalltalk self nil true false super ● 块

Smalltalk 称对象为块,它是包含可执行代码的对象。Java 中最相似的东西是匿名内部类,C# 2.0 中,跟匿名托管相类似。执行“块”无需参数,可以向它发送一个value 消息

Smalltalk

| block |

block := [3 + 4].

block value \

块可以有参数,每一个块参数的声明必须以冒号(:)开头,以竖线(|)表示参数列表的结束和块代码的开始。

Smalltalk

| block |

block := [:x :y | x * 2 + y].

block value: 5 value: 3 \

● 语法结束

到此为止,我们已经介绍了Smalltalk 所有的语法。其余的事情属于类库部分。你是否注意到我们是否忘记了某些事情?if-then-else 或者while 循环?Smalltalk 只使用块和普通的消息发送。

● 控制结构 Smalltalk 没有在语言中内置控制结构。Smalltalk 使用向true 或者flase对象发生消息作为替代。 Java Smalltalk if (tries > 5) return \else return \注意^表示从方法返回,不只是适用于块。

● 循环 Smalltalk 使用块做循环。由于块是对象,所有我们可以先他们发生消息 Java Smalltalk int tries = 0; while (tries <= 5) { tryAgain(); tries++; } | tries | tries := 0. [tries <= 5] whileTrue: [ selftryAgain. tries := tries + 1] alternatively: 5 timesRepeat: [self tryAgain] tries > 5 ifTrue: [^'Too many tries'] ifFalse: [^'Trying again'] 注意timesRepeat: 是整数类型能理解的消息。它简化了块执行的次数 smalltalk入门

原文标题:I Can Read C++ and Java But I Can’t Read Smalltalk 原文作者:Wilf LaLonde

原文链接:http://www.eli.sdsu.edu/courses/spring01/cs635/readingSmalltalk.pdf

简介

有很多人告诉我他很熟悉C++或Java,但是却完全读不懂Smalltalk的代码。对于他们来说,

Smalltalk简直无法理解!对于这个问题我考虑了很久然后得到的结论是他们是对的。如果我随便挑出一些自己多年以前写的Smalltalk代码,然后假设我只明白Java去阅读的时候,我确信我是无法理解那些代码的。其实要读懂Smalltalk只须了解一些非常简单的概念,当然有些概念也是比较微妙。如果“Johnny读不懂Smalltalk代码”,我有办法。我的办法就是通过实际的例子来帮助新手快速理解Smalltalk的概念。我假设读者了解什么是面向对象变成,对于那些已经掌握Smalltalk的读者也请先假装一会没有学过smalltalk。

如此简单的文法

有些语法是很容易理解的,例如使用双引号来标识注视块;单引号标示字符串,单个字符前面加$(例如:$x标示字符“x”)。除此之外,还有symbol的概念,这是一个特殊的字符串,在整个内存中是唯一的。当源代码被编译的时候,编译器会搜索整个内存,如果发现相同的symbol存在则使用已存在的那个。有理数并不节省内存,但是相对于symbol而言处理速度更快(稍候解释)。

“this is a comment” ‘this is a string’ #’this is a symbol’ #thisIsASymbolToo

对于赋值操作和等于号,差别不是很大。

:= //Means assignment

= //Means equality comparison == //Means identity comparison

如果你给我分别使用’a’和’b’命名的对象的引用,我可以告诉你他们是否是同样的对象(使用a == b, 命名等价)或看上去相同实质上不同的对象(使用 a = b构造等价)。直观的来说,== 比较两个被引用对象的地址是否相同,而 = 则比较两个对象的整个内容是否相同。

Smalltalk代码中很少用到逗号,因为他们不是Smalltalk文法组成的一部分。这就是为什么Smalltalk的数组是没有逗号的。例如:

#(1 2 3 4 5)

然而,都好是smalltalk的一个操作符。因此你会看到他被用来连接两个字符串,例如:

‘string1’,’string2’ 无处不在的关键字

Smalltalk中关键字是无处不在的。他们的存在是为了帮助理解代码而不是增加混淆。要明白这到底是怎样一回事,让我们先来看看C++和Java的语法。例如,

t->rotate(a,v); //For C++ t.rotate(a,v); //For Java 上面的代码向对象t发送消息(注:就是调用类方法)rotate,并指定了参数a和v。为了理解这段代码,读者通常需要继续察看作为参数的变量的申明及其类型。让我们假设其有如下的申明:

Transformation t; float a; Vector v;

搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新高中教育Smalltalk 超简明教程 全文阅读和word下载服务。

Smalltalk 超简明教程 .doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/wenku/1100378.html(转载请注明文章来源)
热门推荐
Copyright © 2018-2022 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top