Boo(9)-List

Boo的 List 並不是使用 .Net/Mono 的 List,而是自己實作。
使用的方法很簡單,用中括號或是使用List函數。

l1=[ 1, 2, 3, 4, "a", "b", "c" ]
l2=List( range(10) )
l1.Add( "d" )
l2.Add( "d" )
print l1
print l2
l1.Remove( "d" )
// 輸出結果
// [1, 2, 3, 4, "a", "b", "c", "d"]
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "d"]
// [1, 2, 3, 4, "a", "b", "c"]

除了正常 List 的操作 Add()、Remove() 以外,還提供了 Push()、Pop(),這意味著可以把 List 當 Stack 來使用。

如果你想知道更多 List 的操作,可以在 booish 裡面使用 dir(),來查看。

>>>l=[]
>>>dir(l)

由於 dir() 會傳回一個 IEnumerator,所以你也可以用下面的程式把每個項目輸出。

l=[]
for m in dir(l):
print m

或者,直接參考 Boo 的原始碼 src/boo.lang/list.cs 。

隨著 .Net framework 2.0 推出,Boo 也支援了 Generic 語法,語法可以參考這篇的說明:Boo Generic Syntax

import System.Collections.Generic
l = List[of int]()
l.Add( 10 )
l.Add( 20 )
for i in l:
print i
l.Add( "hello" )  // 這行將會發生錯誤,告訴你不可以加入字串型別

首要的一件事,就是先 import System.Collections.Generic,表明要使用 Generic,否則之後的程式會無法執行。接著使用 [of Type] 的語法,表示 List 要使用指定 Type 的泛型。

使用泛型最明顯的好處是省去轉型的麻煩,因為 List 裡面預設都是使用 object 型別,改用 Generic 以後,可以預先指定好 List 裡面的元素要使用什麼型別。

電影流水帳(2008/05/02~2008/05/02)

心不在焉地看完了三部片…

  • Blood Diamond(IMDB, Wikipedia),中譯:血鑽石。跟軍火之王一樣,都跟非洲有關係,描繪了殘酷的真實面。還好我老婆不愛鑽石,對石頭沒什麼感覺~
  • 忍 SHINOBI(改編自漫畫:甲賀忍法帖甲賀忍法帖)。漫畫裡是兩邊各派十個人幹架,電影只有五個,看完有點失望,原本以為會跟漫畫一樣有很多精彩對戰畫面,不過,當現實與想像有差距時,那就是…失望。如果你沒看過漫畫的話,不妨看看,還不錯。
  • Monster House(IMDB, Wikipedia),中譯:怪獸屋。講萬聖節的故事,屋子因為女主人的怨念而成怪,男主人愛房子,不忍心毀去,為了保護其他人,而變得兇惡、不近人情。小男孩和他的兩個朋友找到了真相,並且解放了這間房子。我覺得還不錯看的故事~

電影流水帳(2008/04/27~2008/5/1)

這次的流水帳有地雷(簡單的劇情)。

  • Awake(IMDB, Wikipedia),中譯:索命麻醉,不是很好的譯名。看完這部片子以後,我有種看到藍色蜘蛛網這種類戲劇的感覺,不過是比較偏怪誕類的那種。故事不是講麻醉的事情,而是講一件謀財害命的謀殺案,不過主角很巧的因為沒有完全進入麻醉狀態,反而在半夢半醒之間把整件事情想通了,可是也無法挽回了。最後他媽媽也突然想通整件事情,於是趕緊聯絡她最信任的醫師趕來,並且自殺捐出心臟,才救回主角一命,同時也把女主角、主刀醫師這些主謀抓起來。看完真的是有種奇妙的感覺~不過劇情普通,不用特別進電影院看。
  • HERO,嗯嗯,還是當日劇來看吧,還可以啦~

Boo(8)-迴圈

基本上迴圈有兩種:for 與 while。
for 與一般語言的 for 不太一樣,反而與 foreach 比較類似,為了要能得到一個 Enumerator,通常都搭配 range():

// 印出 0 到 4
for i in range(5):
print i

while 也沒什麼特別的:

// 同樣印出 0 到 4
i=0
while i<4:
print i
i=i+1

Boo Primer還有提出所謂的 do-while,但實際上是運用 while + break + unless修飾詞來達成的:

// 也是印出 0 到 4
i=0
while true:
print i
i=i+1
break unless i<4

有 break,當然也有 continue:

// 印出 1 3 5 7 9
for i in range(10):
continue if i%2==0
print i

另外再提一個關鍵字,就是 pass,這用來表示程式區塊內不做事情:

// 不會輸出任何結果,因為被 pass 掉了...
i=2
if i%2==0:
pass
else:
print "i!=2"

Boo and Split

剛好遇到這種狀況,要依據字串的某字元然後做出陣列。所以很直覺地,就可以寫出這樣的代碼。

splitter = ( char(','), char('\n') )
fields = inputText.Split( splitter )

不過這段代碼足以讓人搞半天了,boo 會不讓你執行。
非常感謝Google 網上論壇 的Boo Programming Language群組

正好解答了我的問題,原來要這樣寫:

splitter = ( char(','), char('\n') )
fields = inputText.Split( *splitter )

這真是太隱晦不明了…

Boo(7) – if-elif-else、unless

Boo 的 if 述句與 python 相似:

i=5
if i>5:
print "i大於5"
elif i==5:
print "i等於5"
else:
print "i小於5"

很簡單。這邊額外要提到程式區塊的概念,像 C# 是用 { },Pascal 用 begin end,Python 與 Boo 是用縮排來決定程式區塊,所以縮排使用的字元很重要,千萬不要混雜使用,否則你會錯的莫名其妙,在開發時,最好一開始就決定好要使用 tab 字元或是特定數目的空白字元。

運算式,可以使用 and, or 來作連接,或是使用 not 來表示需要相反的條件式。

i=7
if i>=5 and i<=10:
print "i 介於 5~10 之間"
else:
print "超出範圍"
if not i==5:
print "i不等於5"

如果你沒接觸過 perl/python/ruby/php 的話,以下的用法應該會讓你感到新奇:

s="sad"
unless s=="sad":
print "Hello world!"
print "Hello world!" unless s=="sad"
print "I am sad" if s=="sad"

unless 是反面的 if,把它想成 if not 就對了,所以第三行並不會被執行。
此外,unless 與 if 也可以用來修飾前面的述句﹔以第四行來說,unless s==”sad”用來修飾前面的 print “Hello world!”﹔以第五行來說,if s==”sad”用來修飾前面的print “I am sad”﹔當條件符合時,才會印出。
因此第四行的 “Hello world!” 不會被印出,而第五行的 “I am sad” 則會被印出。

這些用法會讓人覺得程式也很口語化~

電影流水帳(2008/04/25~2008/04/26)

兩天衝完四部片,夠猛!不過只有一部片我覺得比較好看~

  • Step up(Wikipedia),中譯:舞出我人生。這應該算是青春勵志片,一個小混混因為跟朋友進馬里蘭學校搞破壞,結果被逮住,法庭判他去學校勞動服務。事情往往就是那麼剛好,女主角因為舞伴受傷,剛好又發現他有才華,於是就找他幫忙,就這樣,發生了一連串的故事。普通,今年好像要上 2 的樣子。
  • Miss little sunshine(IMDB, Wikipedia),中譯:小太陽的願望。這部片子蠻好看的耶,帶小女兒去參加選美的旅行途中發生了一連串的事情,最後大家都解開心結,真的相當好看。
  • Catch that kid(Wikipedia),中譯:小鬼神偷。深愛老爸的女主角,為了突然癱瘓的老爸鋌而走險,去偷銀行的錢,最後以喜劇收場。偷銀行,這算是拍給小朋友看的電影嗎?整體來說普普通通,女主角後來有演出Jumper(移動世界),擔任女主角年輕的時候,出現片段很短。
  • Miami Vice(IMDB, Wikipedia),中譯:邁阿密風雲。雖說是從影集翻拍的,但老實說,我覺得翻拍的不怎麼樣,劇情普通。原本對這部片子很期待的說,因為演員陣容還蠻堅強的。

電影流水帳(2008/04/22~2008/04/24)

真的是太拼了,短短三天看完兩部片子!

  • Vantage Point(IMDB, Wikipedia),中譯:刺殺據點。實際上整個事件發生的時間我想只有大概二十到三十分鐘,或許更短也不一定,短短的時間內,可以從多個面向去把事件發生的經過重現一遍,然後剪成一小時約 30 分鐘的片子。我覺得很不簡單,片子看起來一氣呵成,不知道導演出動了多少攝影機,才能一氣呵成地把所有發生的經過拍下來?還不錯看的片子。
  • 奪帥(IMDB, Wikipedia),另外一個名字:血戰。演員陣容堅強,不過可惜,故事不怎麼樣,有點不知所云的感覺。唉~我的時間浪費掉了啊~