日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Smalltalk為什么讓我愛不釋手?

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

◆ Smalltalk

◆ Lisp

◆ Erlang

◆ Haskell

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

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

 
 
 
 
  1. 1 + 1

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

 
 
 
 
  1. m := 1 + 1

句子都要以點號(句號)結(jié)尾,像這樣:

 
 
 
 
  1. m := 1.
  2. m := m + 1

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

 
 
 
 
  1. Transcript show: 'Hello world'

運行的效果會是這樣:

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

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

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

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

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

但你要是從Smalltalk的視角來看,你會發(fā)現(xiàn)它強大的多。它實際上是個閉包(closure)。看這段:

 
 
 
 
  1. t := [
  2.   Transcript show: 'Hello world'
  3. ]

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

 
 
 
 
  1. t class

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

 
 
 
 
  1. t value

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

 
 
 
 
  1. 10 printString

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

 
 
 
 
  1. 10 printStringBase: 2

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

 
 
 
 
  1. 10 printStringBase: 2 nDigits: 10

很可愛,不是嗎?這個方法叫做printStringBase:nDigits:。我沒在其它地方見過這樣的語法;只有Objective-C是個例外,因為它是從Smalltalk承襲過來的。

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

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

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

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

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

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

運行起來的結(jié)果像這樣:

好了,我們來用一用它:

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

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

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

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

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

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

Object subclass: #PBoolean

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

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

 
 
 
 
  1. equals: other
  2.   ^ PTrue new

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

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

得到的是true。我們已經(jīng)接近目標了,但還不是if。if應(yīng)該是個什么樣子?它的樣子應(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
  7. ]

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

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

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

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

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

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

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


網(wǎng)頁標題:Smalltalk為什么讓我愛不釋手?
文章源于:http://m.5511xx.com/article/cocjgdi.html