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}"
    

    Boo(16)-Class

    Boo 的類別(Class),跟 Python 很像,基本上不複雜。

    class Animal:
    pass
    class Dog(Animal):
    def constructor():
    pass
    def constructor( name ):
    _name=name
    def destructor():
    pass
    def Bark():
    print "${_name} is barking..."
    [property(Name)]
    _name = "Anonymous"
    spot=Dog( "spot" )
    whity=Dog( Name:"whity" )
    print spot.Name
    whity.Bark()
    

    class 跟 C# 一樣,可以加上 public、protected、internal、protected internal、private、abstract、final 等修飾詞,預設是 public。
    繼承的話,就是在類別名稱後面加上小括號,並在括號內放置欲繼承的類別。
    建構子與解構子分別是 constructor 與 destructor,可寫可不寫。
    方法的宣告其實跟前面提到的函數很像,都是使用 def ,def 的前面還可以加上 abstract、static、virtual、override 等修飾詞。
    最後是欄位,通常就跟寫運算式一樣,給定一個值就行了,像這樣:_name=””,前面的 [property()] 是 attribute,是一個偷懶的寫法,實際上是 get/set 的組合體:

    class Cat(Animal):
    def constructor():
    pass
    def constructor( name ):
    _name=name
    def destructor():
    pass
    def Meow():
    print "${_name} is meowing..."
    Name as string:
    get:
    return _name
    set:
    _name=value
    _name = "Anonymous"
    

    看到這裡,你有發現到這行嗎?whity=Dog( Name:”whity” )。咦,莫非在建構時可以直接指定屬性的值,沒錯,這寫起程式來方便很多啊~

    參考資料:

    電影流水帳(2008/05/27~2008/05/30)

    一次五片,算是五連發嗎?

    • 10,000 BC(IMDB, Wikipedia),中譯:史前一萬年。電影就是電影,如果你認為這部片子會好好考據史實的話,最好不要對這部片子抱太高期望,因為它並不是你所想像中的片子,反而比較像是類似魔蠍大帝那種歷史傳奇的故事。女主角Camilla Belle蠻正的,不錯 (Google圖片搜索)。
    • National Treasure: Book of Secrets(IMDB, Wikipedia,中譯:國家寶藏2-古籍秘辛。上一集的班底再次出動,這次還扯上英國女王、美國總統,不過我覺得這次比較沒什麼感覺~普普通通。
    • The Lizzie McGuire Movie(IMDB, Wikipedia),中譯:莉琪的異想世界。學生片,少女畢業,畢業旅行去羅馬,在羅馬發生了不少事。女主角Hilary Duff在 Disney 頻道蠻紅的樣子,所以才有一系列的電影。
    • Next(IMDB, Wikipedia),中譯:關鍵下一秒。拍攝的手法讓你不知道從什麼時候開始是主角的預測,原來從邂逅發生感情開始,就是主角對未來的預測了,搞半天,其實只需要看一半就行了,因為之後的事情都沒發生過。
    • The secret of Loch Ness,中譯:尼斯湖水怪傳說。這部片子我在IMDBWikipedia上都找不到,只能列上Yahoo! Movie的連結。最初我本來以為是The Water Horse: Legend of the Deep這部片,後來才發現不是。網路上影評兩極化,主要原因是預告片剪得很爛,幾乎把劇情全部剪進去了。不過我是還蠻喜歡這部片子的,很適合小朋友看,很溫馨。

    Boo(15)-內建函數:容器操作

    join()、map()、array()、matrix()、iterator()、enumerate()、range()、reversed()、zip()、cat()
    這一類的函式還…蠻多的,大多都與 python 相容。
    join(),把 Enumerator 裡面每個元素轉成字串,最後串成一個字串傳回。你也可以加上第二個引數,他會自動幫你加上,例如:join( [1,2,3,4,5], “:” ) 會得到 “1:2:3:4:5” 的字串。
    map(),對 Enumerator 裡面每個元素施行指定的函式。
    array(),傳入一個 Enumerator 回傳一個陣列。
    matrix(),建立多維陣列。
    iterator(),取得物件的 IEnumerable 介面,如果物件沒有 IEnumerable 介面,但有繼承 TextReader 的話,則改用 TextReaderEnumerator.lines() 取得 IEnumerable。這個函數在內部非常頻繁地被這裡提到的其他函數使用到。
    enumerate(),先取得物件的 IEnumerable 介面,然後傳回類似 (index, value ) 的 Enumerator,舉例來說,List( enumerate( [ “a”, “b”, “c”, “d” ] ) ) 的結果會是:[(0, ‘a’), (1, ‘b’), (2, ‘c’), (3, ‘d’)]。
    range() 很容易理解,傳入數值,會回傳有循序數值的 Enumerator,你也可以傳入起始與結束的數值或是傳入起始、結束與遞增數。
    reversed(),將 Enumerator 裡面的元素以相反順序擺放,內部是使用 ReversedListEnumerator 類別來完成這件事情。
    zip(),傳入多個 Enumerator,它會把每個 Enumerator 的第 0 個元素放到一起、第 1 個元素放到一起…以此類推,最後再傳回一個 Enumerator。這個函數看例子會比較容易了解,array(zip([‘a’,’b’,’c’],[4,5,6],[‘aa’,’bb’,’cc’])) 的結果會是 ((‘a’, 4, ‘aa’), (‘b’, 5, ‘bb’), (‘c’, 6, ‘cc’))。老實說,我還沒想到要怎麼用…
    cat(),跟 join 有點像,不過不會傳回字串,而是把傳入的 Enumerator 串接起來成一個 Enumerator 再傳回。
    這裡有的函數我沒舉例,要看例子的話,可以參考Boo Primer中文版對內建函數的說明

    LXPanel Plugin in Managed code?

    看到 Fred 寫的Fred’s blog: 讓我們輕鬆自在設計自己的 LXPanel Plugin,心想,應該也可以用 mono c#、boo 等來寫吧~
    於是想到gimp-sharp,這個 library 讓你可以使用 c#、vb.net、boo 寫給 gimp 使用的 plugin,下載來看以後,真是令人驚訝~
    原來 gimp 是使用外部執行的方式去呼叫這些 plugin,而這些 plugin 以收取參數與呼叫 gimp library 的方式來與 gimp 主體進行溝通。
    那麼這樣,似乎就行不通了。一般 C/C++ plugin 的處理方式,都是以 dl_xxxx 系列函數來開啟 plugin(.so) 進行操作,對於 managed code 來說,assembly(.dll)並沒有開放這些介面。
    從 C/C++ 呼叫 Managed code 是可行的,目前只適用於 Mono,請參閱這裡:Embedding Mono
    這裡有幾個範例,應該是夠用了。
    看起來如果要作 Plugin 給 lxpanel 用的話,還是得用 C 寫一個 Plugin,然後這個 Plugin 負責載入 mono 的 assembly,再把必要的資訊傳進去給 managed code。
    有可能作成 chain-loader 的形式,由這個 Plugin 再去把其他用 Managed code 做的 Plugin 載入嗎??
    恐怕還是得再看 lxpanel 內部如何用 plugin 才能決定。

    LXDE in Ubuntu

    如果你想在 Ubuntu 裡試試 LXDE 的話,加入這個軟體來源:

    deb http://ppa.launchpad.net/lxde/ubuntu/ hardy main universe multiverse restricted

    ,然後安裝 lxde、lxsession 即可 (sudo apt-get install lxde lxsession)。接下來登出,將作業階段選為 LXDE,再登入即可。
    LXDE 的確速度蠻快的,不過,不能瀏覽網路上的芳鄰,這實在是讓我無法下定決心跳槽啊…
    補充:啊,LXDE 的下載網頁也有提到一個來源:

    deb http://people.linux.org.tw/~pcman/ubuntu/ ./ 

    電影流水帳(2008/05/21~2008/05/26)

    六月底前要來統計一下,看看上半年看了多少部電影。

    • Jade Soturi(IMDB, Wikipedia),中譯:玉戰士。故事穿梭在現代與過去之間,簡單的說,在前世由於主角為了愛情,不想得到永恆的生命,選擇了不殺死魔鬼,將其封印,讓自身掉入輪迴。到了現代,由於文物的出土,導致事情必須作一個了結,在主角鍛造 Sampo 的過程中,慢慢回想起過去,也知道自己必須要面對並解決。整體來說,感覺上很艱澀,不容易懂,藝術的氣息很重。除此之外,張靜初(IMDB)真的蠻正的(照片)。
    • TEETH(IMDB, Wikipedia)。這部片子台灣有上嗎?從故事內容看起來,並不是台灣片商會喜歡的類型,但在中文維基百科上能找到它的蹤跡:小心有牙,或許是影展片也不一定。我是第一次聽到有牙陰道的傳說,片中的女主角由於受限於教規的約束,從來沒有探索過自己的身體,也以為自己與其他女孩一樣,因緣際會被男友強上,才發現自己與其他女孩的不同,被強暴、自己的身體與其他人不同、母親過世,一連串的事件讓女孩心理產生了變化,看到最後居然會想莞爾一笑,果然不負黑色喜劇之名。