自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Smalltalk為什么讓我愛不釋手?

開發(fā) 前端
C,C++,Python等,這些算是傳統(tǒng)的語(yǔ)言吧,我從這些語(yǔ)言上學(xué)會(huì)了基本的編程技術(shù)。這之后,又有四種語(yǔ)言,它們讓我學(xué)到了一些新的東西。這些語(yǔ)言改變了我思考的模式,雖然我從來(lái)沒有使用過(guò)它們,但它們都是絕對(duì)值得你學(xué)習(xí)一下的.

C,C++,Python等,這些算是傳統(tǒng)的語(yǔ)言吧,我從這些語(yǔ)言上學(xué)會(huì)了基本的編程技術(shù)。這之后,又有四種語(yǔ)言,它們讓我學(xué)到了一些新的東西。這些語(yǔ)言改變了我思考的模式,雖然我從來(lái)沒有使用過(guò)它們,但它們都是絕對(duì)值得你學(xué)習(xí)一下的。它們是:

Smalltalk

Lisp

Erlang

Haskell

你也許還會(huì)把Prolog加入這個(gè)列表中,但我沒有學(xué)過(guò)Prolog。本文是關(guān)于Smalltalk這種語(yǔ)言的。

我的目的并不是教大家怎么使用Smalltalk,而是向你展示一些Smalltalk能做到、而其它語(yǔ)言做不到的一些事情(聲明:有些語(yǔ)言也能做到,它們都是Smalltalk的一些方言)。不用說(shuō),我需要向你先介紹一下這種語(yǔ)言的一些基本知識(shí),之后我才能向你展示更有價(jià)值的東西,那么就開始吧,***個(gè)程序:

  1. 1 + 1 

很顯然,計(jì)算的結(jié)果是2.如果你想把它存到一個(gè)變量里,這樣做:

  1. :1 + 1 

句子都要以點(diǎn)號(hào)(句號(hào))結(jié)尾,像這樣:

  1. :1.  
  2. :m + 1 

在Squeak——這是Smalltalk語(yǔ)言的一種版本實(shí)現(xiàn)——里,有一個(gè)對(duì)象叫做Transcript,你把消息發(fā)送給它,它能把消息顯示到屏幕上。它很像一個(gè)Log窗口。你要這樣去用它:

  1. Transcript show: 'Hello world' 

運(yùn)行的效果會(huì)是這樣:

 

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

 

Smalltalk的這種語(yǔ)法非常的獨(dú)特。消息(message)——這在其它語(yǔ)言里也叫做“方法”——是show: (包括冒號(hào)),它接受一個(gè)參數(shù)。我們用下面的寫法可以讓這個(gè)句子運(yùn)行10遍:

  1. 10 timesRepeat: [  
  2.   Transcript show: 'Hello world'  

現(xiàn)在你開始能看出Smalltalk的獨(dú)特之處了。我把消息timesRepeat:發(fā)送到對(duì)象“10”——一個(gè)Integer類。這N次的循環(huán)操作是由這個(gè)Integer來(lái)執(zhí)行的,你認(rèn)真想想,其實(shí)很有道理。

第二個(gè)有趣的部分是代碼段落(block),是在方括號(hào)里面的部分。你可能認(rèn)為它跟其他種語(yǔ)言里的代碼段落語(yǔ)法是同樣的道理,比如Java的:

  1. for(int i=1; i<11; i++) {  
  2.   System.out.println("Hello world");  

但你要是從Smalltalk的視角來(lái)看,你會(huì)發(fā)現(xiàn)它強(qiáng)大的多。它實(shí)際上是個(gè)閉包(closure)??催@段:

  1. := [  
  2.   Transcript show: 'Hello world'  

現(xiàn)在,我有了一個(gè)叫做t的變量,它的類型是BlockClosure,通過(guò)這個(gè)變量,我可以做我想做的任何事情。如果我向它發(fā)送class消息,它會(huì)返回它的class類型:

  1. t class 

如果我向它發(fā)送value消息,它會(huì)運(yùn)行,會(huì)在Transcript里留下“Hello World”字符:

  1. t value 

讓我們多看幾段程序。一個(gè)沒有任何參數(shù)的消息:

  1. 10 printString 

帶有一個(gè)參數(shù)的消息:

  1. 10 printStringBase: 2 

帶有兩個(gè)參數(shù)的消息:

  1. 10 printStringBase: 2 nDigits: 10 

很可愛,不是嗎?這個(gè)方法叫做printStringBase:nDigits:。我沒在其它地方見過(guò)這樣的語(yǔ)法;只有Objective-C是個(gè)例外,因?yàn)樗菑腟malltalk承襲過(guò)來(lái)的。

小玩意已經(jīng)說(shuō)的不少了,現(xiàn)在說(shuō)點(diǎn)復(fù)雜點(diǎn)兒的東西。我們來(lái)創(chuàng)建一個(gè)類:

  1. Object subclass: #MyClass  
  2.        instanceVariableNames: ''  
  3.        classVariableNames: ''  
  4.        poolDictionaries: ''  
  5.        category: 'Pupeno' 

注意,一個(gè)類的創(chuàng)建是通過(guò)向其它類發(fā)送消息—包括名字和一些參數(shù),告訴它我要繼承它。這是一個(gè)消息,跟其它類型的方法調(diào)用一樣。對(duì)象是類,類也是對(duì)象。Smalltalk的對(duì)象模式非常的優(yōu)雅,但這是另外一個(gè) 話題。

現(xiàn)在我們有了一個(gè)類,我們來(lái)創(chuàng)建一個(gè)方法,叫做greet:就在這個(gè)類里。

  1. greet: name  
  2.   "Greets the user named name"  
  3.  
  4.   | message |  
  5.  
  6.   message :'Hello ', name.  
  7.   Transcript show: message. 

在方法定義里,首先我們給這個(gè)方法加了一個(gè)注釋,然后是管道 (“|”)包著的本地變量,然后是方法的實(shí)現(xiàn),我把”Hello“放到了變量message里,然后用逗號(hào)符把它和變量name連接起來(lái)。然后我把它發(fā)送到Transcript里。

運(yùn)行起來(lái)的結(jié)果像這樣:

 

MyClass greet method

 

好了,我們來(lái)用一用它:

  1. :MyClass new.  
  2. m greet: 'Pupeno' 

為了創(chuàng)建一個(gè)類MyClass的對(duì)象,我們向這個(gè)類發(fā)送new消息。這個(gè)new并不是像Java里的關(guān)鍵字。new是一個(gè)方法。你可以看它的源代碼,覆蓋它,等等。不要?jiǎng)铀?,除非你十分清楚你在做什么?/p>

事實(shí)上,如果你想一下,你會(huì)發(fā)現(xiàn)我們沒有看到任何的關(guān)鍵字。看看我們寫過(guò)的這些代碼,沒有什么要記住的關(guān)鍵字!更重要的,目前為止,你已經(jīng)基本的認(rèn)識(shí)Smalltalk了。Smalltalk就是這些,但就像是一個(gè)小積木塊,這些小塊能讓你搭建出你想要的任何東西。

不錯(cuò),就這些,我要說(shuō)的就這些。我們看到了,Smalltalk里沒有循環(huán),它有整數(shù)類,這個(gè)類里實(shí)現(xiàn)了timesRepeat:消息,可以用來(lái)把事情重復(fù)執(zhí)行N次。像這樣用于循環(huán)操作的方法到處都是。

你會(huì)問(wèn),有沒有if這個(gè)關(guān)鍵字?Smalltalk里肯定有一個(gè)if關(guān)鍵字,不是嗎?不,沒有。你所謂的if語(yǔ)法在Smalltalk里可以用你剛才看到的類和消息傳遞的機(jī)制實(shí)現(xiàn)。為了好玩,我們來(lái)實(shí)現(xiàn)一個(gè)。

我們從創(chuàng)建一個(gè)PBoolean類開始,然后兩個(gè)繼承它的類——PTrue 和 PFalse。

Object subclass: #PBoolean

  1. Object subclass: #PBoolean  
  2.        instanceVariableNames: ''  
  3.        classVariableNames: ''  
  4.        poolDictionaries: ''  
  5.        category: 'Pupeno'  
  6.  
  7. PBoolean subclass: #PTrue  
  8.        instanceVariableNames: ''  
  9.        classVariableNames: ''  
  10.        poolDictionaries: ''  
  11.        category: 'Pupeno'  
  12.  
  13. PBoolean subclass: #PFalse  
  14.        instanceVariableNames: ''  
  15.        classVariableNames: ''  
  16.        poolDictionaries: ''  
  17.        category: 'Pupeno' 

我們之前創(chuàng)建了一個(gè)類,MyClass,我們要給它定義一個(gè)equals:方法,它能返回true和false,也就是我們的PTrue 和 PFalse。

  1. equals: other  
  2.   ^ PTrue new 

這個(gè)小帽子,^,是返回的意思。我寫的是硬編碼讓它返回true?,F(xiàn)在我們可以在程序來(lái)用它了:

  1. m1 :MyClass new.  
  2. m2 :MyClass new.  
  3. m1 equals: m2 

得到的是true。我們已經(jīng)接近目標(biāo)了,但還不是if。if應(yīng)該是個(gè)什么樣子?它的樣子應(yīng)該是這樣:

  1. m1 :MyClass new.  
  2. m2 :MyClass new.  
  3. (m1 equals: m2) ifTrue: [  
  4.   Transcript show: 'They are equal'; cr  
  5. ] else: [  
  6.   Transcript show: 'They are false'; cr  

估計(jì)你在想,怎么才能實(shí)現(xiàn)這樣的效果。我在PTrue里加入了一個(gè)方法:

  1. ifTrue: do else: notdo  
  2.   ^ do value 

這個(gè)方法看上去是接受2個(gè)參數(shù),但執(zhí)行時(shí)接受***個(gè),忽略第二個(gè)。對(duì)于PFalse,正好相反:

  1. ifTrue: notdo else: do  
  2.   ^ do value 

這就可以了。一個(gè)可以用的if!如果讓我說(shuō),我覺得這真的很神奇。如果你去檢查Squeak了的代碼,你會(huì)發(fā)現(xiàn)它里面的if就是這樣實(shí)現(xiàn)的:

 

True's ifTrue:ifFalse:

 

如果你使用的編程語(yǔ)言能允許你創(chuàng)建像if條件這樣的基本功能,那它就可以讓你創(chuàng)建任何你想要的東西。

原文:http://www.aqee.net/why-i-love-smalltalk/#more-2494

【編輯推薦】

  1. 程序員育兒新工具Small Basic
  2. 2011年4月編程語(yǔ)言排行榜:告別Smalltalk
  3. 谷歌宣布推出Dart編程新語(yǔ)言
  4. 2011下半年Web編程語(yǔ)言和腳本語(yǔ)言的就業(yè)趨勢(shì)
  5. 每一門編程語(yǔ)言都是上輩子折翼的天使
責(zé)任編輯:陳貽新 來(lái)源: 外刊IT評(píng)論
相關(guān)推薦

2021-01-18 09:55:46

Spring代碼Java

2010-12-08 09:59:10

CSS

2021-04-25 10:15:38

Python編程語(yǔ)言軟件包

2009-08-29 08:41:07

Windows 7新功能

2021-04-13 10:07:08

Python軟件包編程語(yǔ)言

2021-01-24 11:55:40

spring升華代碼的技巧開發(fā)

2011-03-31 14:22:28

Chrome插件

2017-05-24 18:00:13

AndroidAndroid DatView

2013-05-06 22:52:10

智能手機(jī)交互方式用戶體驗(yàn)

2011-05-12 09:12:16

Ubuntu 11.0

2021-01-20 06:29:42

JS工具操作符

2024-12-17 15:00:00

Python代碼

2021-12-09 13:30:17

微軟

2021-02-02 21:42:30

VS Code編輯器開發(fā)

2024-07-24 08:33:06

JavaScript匯編語(yǔ)言

2016-05-05 10:54:53

Android開發(fā)應(yīng)用

2023-07-04 08:19:25

IDEA插件

2021-01-11 08:21:34

spring升華代碼的技巧開發(fā)

2021-07-13 10:59:49

Python庫(kù)可視化

2020-11-03 15:10:55

Spring Batc框架Java
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)