Boo(20)-Generator 函式

Generator 函式其實就跟 C# 的 Iterator 一樣,利用 yield 關鍵字先把值傳回讓呼叫者使用。
使用 Generator/Iterator 最大的好處是可以讓函式只做必要的邏輯,而不需要把一些事情綁在迴圈裡面。
下面就是一個很標準的尋訪目錄樹的範例,尋訪的工作交給 walk,主程式則負責依據傳回的值作處理。

import System
import System.IO
def walk( path as string ):
di = DirectoryInfo( path )
for d in di.GetDirectories():
yield d as FileSystemInfo
for f in di.GetFiles():
yield f as FileSystemInfo
for node in walk( "." ):
if node isa DirectoryInfo:
print "[${node.Name}]"
elif node isa FileInfo:
print node.Name

參考自:Generators
p.s. 這系列文章一定會持續寫到 macro 出現為止。

電影流水帳(2008/6/20~2008/6/26)

公司福委會發了兩張免費電影票,該去看什麼片呢?或是送給老婆的妹妹?

  • Pirates of the Caribbean: At World’s End(IMDB, Wikipedia),中譯:神鬼奇航-世界的盡頭。發哥其實戲份不多,有點被廣告誤導了。一行人從世界盡頭回來的過程還蠻有趣的,居然要設法翻船,才能回到原來的世界,這也難怪The Flying Dutchman要能潛到水底。最後的Calypso好像不夠 powerful 啊~跟想像中不太一樣,照理來說被七大海盜王封印的怪物應該更厲害才對~
  • Atonement(IMDB),中譯:贖罪。前面一個小時,我覺得很不錯,小女孩演的很不錯。只是到了後面,我就覺得好像少了什麼似的,我想是因為沒說明到贖罪的原因吧。

.NET essential 第二章 CLR 筆記

主要是紀錄以前不知道或是看過沒深入了解的一些東西:

  1. Managed C++ 編譯出來的執行檔無法用mono執行,可能是因為 Native code 跟 IL code 放到一起的關係。
  2. 從 stack-based 的 value type 轉成 heap-based 的 reference type 的過程稱作 boxing,反之稱作 unboxing。
    int i=1;
    object obj = i; // boxing
    int j = (int)obj; // unboxing
    
  3. 為了要讓各種語言能在 CLR 上執行,有 Common Language Specification 的 ECMA 標準 – Standard ECMA-335
  4. NGen 可以預先將 IL code 轉為 Native executable code,省掉 JIT compiler 的工作(pre-JITting),因此可以加速。mono裡似乎是用
    mono -O=all --aot your-assembly

    來替代的樣子。

Boo 的 currying

拜讀了Jserv大的”以 C 語言實做 Functional Language 的 Currying”Thinker大的”真 C 語言實做 Functional Language 的 Currying”以後,決定也來挖掘一下 Boo 的 currying 寫法,根據這篇文章:Boo Programming Language Languages Currying Def Return World,程式碼出乎意料的簡單:
[python]
//Currying:
plusX = { a as int | return { b as int | return a + b }}
print plusX(3)(4)
[/python]
就這樣。老實說,大概懂了,可是又不是很懂,也沒想到用途。
所以,就跟沒懂是一樣的。

電影流水帳(2008/06/13~2008/6/19)

中東的女子莫名其妙地就受到很多束縛,焦糖人生裡的Nisrine為了結婚,還跑去作處女膜重建手術。在台灣早期的年代,也有同樣的事情,只是當時無法作處女膜重建手術,而以偷偷滴血的方式來掩護。這些事情從現在的角度來看,真的是覺得不可思議。

  • Sukkar banat(Caramel)(Wikipedia),中譯:焦糖人生。很難說明的感覺,這就是人生吧~蠻好看的片子,不會太枯燥。導演Nadine Labaki自己下海去演,原來她之前就演過好幾部片子,而這部片子是她自導自演的第一部片子,嗯,她本人還蠻正、蠻有魅力的。
  • The Da Vinci Code(IMDB, Wikipedia),中譯:達文西密碼。與原著相當接近,我覺得拍得還不錯,蠻好看的。

Boo(19)-例外處理

例外處理的語法與 Python 相近,差別在於 Boo 使用 ensure,而 Python 使用 finally。
除此之外,Boo 統一使用 except 處理各種例外,而 Python 使用 else 處理無法處理的例外型態。
[python]
import System
class MyException(Exception):
_msg as string
def constructor( s as string ):
_msg = s
override def ToString() as string:
return “MyException::${_msg}”

// 試著調整這兩個變數試試看
isExceptionHappen = false
isMyExceptionHappen = true
try:
// .. do something …
if isExceptionHappen:
raise Exception(“Something wrong.”) // 提出例外情況
// …
if isMyExceptionHappen:
raise MyException(“Hey!!”)
except e as MyException:
print e.ToString()
except e as Exception:
print e.Message
ensure:
print “不管有沒有錯誤,這裡都會被執行。”
[/python]
參考:Boo Primer – 例外Python tutorial – 8. Errors and Exceptions

Boo(18)-命名空間

.NET上的語言幾乎都導入命名空間了,Boo 無法置身事外…

命名的方式,則是在原始檔第一行加上: namespace 命名空間名稱
撇開註解不算,命名空間的宣告,無論如何都要是程式碼的第一行,否則會有錯誤發生。

引用時,則是使用 import 關鍵字,例如:

import System
Console.WriteLine( "Hello world!" )
// 為甚麼要引用命名空間?因為這樣寫很累...
System.Console.WriteLine( "Hello again." )

你也可以指明組件(Assembly)的名稱,所以這幾種寫法也行:

import System.Data from System.Data
import Gtk from "gtk-sharp"

對了,組件不需要特別加上 “.dll”

電影流水帳(2008/05/31~2008/6/12)

  • 21(IMDB, Wikipedia),中譯:決勝21點。很不錯的故事,只是,我不喜歡那樣的結局,太歡樂了。
  • P.S. I love you(IMDB, Wikipedia)。一個無法擺脫丈夫死去傷痛的女子,靠著丈夫生前寄出的信,慢慢走出傷痛。女主角不夠正,這是缺憾。配角Gina Gershon看來很眼熟,看過IMDB上的 Profile以後,發現她果然演過很多片子~差點把她跟Elizabeth Hurley搞混。片中另一配角Denise搭訕用的橋段很酷,先記下:
    1. I love your something.
    2. What’s your name?
    3. Are you single?
    4. Are you gay?
    5. Are you working?
    6. 最後親吻試試看是否合適

    。飾演女主角媽媽的Kathy Bates也很棒。看完以後我在想,如果我的親人走了,我能夠輕易地擺脫傷痛嗎?

  • 幾個 launchpad 上的 apt repository

    要衝 banshee 1.0 版的話,可以試試這個:
    deb http://ppa.launchpad.net/banshee-team/ubuntu hardy main multiverse restricted universe
    上星期(2008/6/5)已經釋出了 1.0.0 版,跟 0.13 比起來,速度可說是兔子與烏龜,主要原因是 1.0 在資料庫上做了適當的索引與調整。
    目前 ubuntu 上的 mono 是 1.2.6,要試最新版,除了下載官方網站的 installer 來安裝與 Mono for Debian(Mono – General – Mono 1.9.1 and MonoDevelop 1.0 Packages for Debian Etch) 之外,只能試這個了:
    deb http://ppa.launchpad.net/mono-edge/ubuntu hardy main multiverse restricted universe
    http://ppa.launchpad.net 上還蠻多 repository 可以試試看的,有遇到沒打包的軟體,就進去找找,或許已經有人在實驗了。

    Boo(17)-結構與列舉

    結構(struct)跟類別很類似,最明顯的差別在於 class 被換成 struct 了,類別的一些特性也可以在結構上使用。
    其他的差別:無法繼承類別、結構,只能實作 Interface﹔結構是值型別,在複製實體時,是整個克隆(Clone)而不是像類別一樣,只做參考。

    struct Dog:
    def constructor( name ):
    _name=name
    [property(Name)]
    _name as string
    emptydog=Dog()
    print "emptydog.Name=${emptydog.Name}"  // 什麼都沒印出
    lucky=Dog("Lucky")
    print "lucky.Name=${lucky.Name}"  // 印出 Lucky
    

    列舉(enum),如果你有用過 C/C++/C# 的話,應該不陌生:

    // 宣告列舉
    enum Day:
    Sunday
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Sunday
    // 也可以指定數值
    enum Task:
    TODO=100
    FIXME=101
    // 列印
    print Day.Sunday
    // 尋訪列舉型別裡所有元素
    for s in Enum.GetNames(Day):
    print s
    // 另一種
    for n,v in array( zip( Enum.GetNames(Task), Enum.GetValues(Task)) ):
    print "${n}=${v}"