在「RIA說文解字」一文中,我提到了RIA的幾個技術,雖然當時沒提到REBOL,但是我心理其實很清楚,REBOL相當適合做RIA。在這篇「REBOL讓你讚嘆WOW」一文章,我特別說明REBOL具有RIA領域的潛力,因為:
(1) 執行環境超小
(2) 寫出來的程式小
(3) 跨越許多平台
(4) 支援許多標準協定
我認為,在RIA領域,REBOL會比Flash/AIR、Silverlight/WPF、Curl更適合。
根據內部的消息,REBOL 3.0會開始著墨在RIA領域。REBOL/IOS、REBOL/Desktop…等應用,以後會朝RIA的方向邁進。我想,這應該就是之前Carl在「A Busy Spring 2008」一文中所提到的祕密計畫。
2008年6月20日
相等
欲判斷兩個值是否相等,利用「=」op!或者「equal?」action!,例如:
>> 1 = 1
== true
>> equal? 1 1
== true
>> "ABC" = "abc"
== true
即使型別不同,值也可能相等,例如:
>> 1 = 1.0
== true
上面的1是integer!,而1.0是decimal!,兩者型別不同。
如果要求嚴格一點,必須值和型別都一致,才能算相等,這時候使用「==」op!或「strict-equal?」action!。例如:
>> 1 == 1.0
== false
>> strict-equal? 1 1.0
== false
判斷兩個值是否不相等,利用「<>」op!或「!=」op!,或者「not-equal?」action!,例如:
>> 1 <> 2
== true
>> 1 != 2
== true
>> not-equal? 1 2
== true
判斷兩個值不相等「且」型別也不一致,利用「strict-not-equal?」action!(沒有對應的op!可用)。目前「strict-not-equal?」有bug。
=?用來判斷兩個參考(reference)是否一樣(identical),只有用在function, Series, object等參考型別,才有意義。用在其他型別時,相當於「=」。「=?」如果一邊是參考型別,另一邊是其他型別(非參考),則一定為false。
>> 1 = 1
== true
>> equal? 1 1
== true
>> "ABC" = "abc"
== true
即使型別不同,值也可能相等,例如:
>> 1 = 1.0
== true
上面的1是integer!,而1.0是decimal!,兩者型別不同。
如果要求嚴格一點,必須值和型別都一致,才能算相等,這時候使用「==」op!或「strict-equal?」action!。例如:
>> 1 == 1.0
== false
>> strict-equal? 1 1.0
== false
判斷兩個值是否不相等,利用「<>」op!或「!=」op!,或者「not-equal?」action!,例如:
>> 1 <> 2
== true
>> 1 != 2
== true
>> not-equal? 1 2
== true
判斷兩個值不相等「且」型別也不一致,利用「strict-not-equal?」action!(沒有對應的op!可用)。目前「strict-not-equal?」有bug。
=?用來判斷兩個參考(reference)是否一樣(identical),只有用在function, Series, object等參考型別,才有意義。用在其他型別時,相當於「=」。「=?」如果一邊是參考型別,另一邊是其他型別(非參考),則一定為false。
2008年6月19日
In REBOL 3.0, op! is infix only.
剛剛發現,在REBOL 3.0中,op!居然「只能」進行中序(indix)運算,這和REBOL 2.x的作法不同。
我認為R3的作法比較好,可以簡化解譯器。以後op!應該不會再支援prefix。
R2 >> 1 + 2
== 3
R2 >> + 1 2
== 3
R3 >> 1 + 2
== 3
R3 >> + 1 2
** Script error: + operator is missing an argument
我認為R3的作法比較好,可以簡化解譯器。以後op!應該不會再支援prefix。
Bug: change/part
軟體開發就是這樣,有時候消除掉十個Bug,卻會因此導致一個原本不存在的Bug。剛剛發現,原本沒問題的函數Change,現在卻有了一個Bug。
由於Change是Action!,所以我無法fix。我已經將它呈遞到Bug Database了。
>> data: "C# Rules"
== "C# Rules"
>> change/part data "REBOL" 2
== "les"
>> data
== "REBOLles"
由於Change是Action!,所以我無法fix。我已經將它呈遞到Bug Database了。
2008年6月17日
Cheyenne Web Server
看到Cheyenne(http://cheyenne-server.org/),你一定會感到很驚訝…一個具有實用功能的Web Server系統,居然如此小巧!Windows版本的exe檔,不到500 KB,這主要是因為,Cheyenne是用REBOL開發出來的。
Cheyenne作者Dockimbel表示,在一般雙核心的伺服器上,可以同時服務500個請求,Cheyenne適合用來架設中小型網站,也相當適合用來架設個人網站。目前Cheyenne雖然仍在Beta階段,但是已經相當穩定,也在某些網站中實際運作一段時日。
Cheyenne對於Web標準的支援已經算很完備,且持續在進步中。你可以在Cheyenne網站的首頁看到它目前所支援的標準,也可以在此下載它的REBOL源碼(BSD授權方式)或執行檔(Windows、Linux、Mac OS)。請注意,如果你要透過源碼執行Cheyenne,請使用REBOL 2.x版,而非REBOL 3.0版。
Cheyenne作者Dockimbel表示,在一般雙核心的伺服器上,可以同時服務500個請求,Cheyenne適合用來架設中小型網站,也相當適合用來架設個人網站。目前Cheyenne雖然仍在Beta階段,但是已經相當穩定,也在某些網站中實際運作一段時日。
Cheyenne對於Web標準的支援已經算很完備,且持續在進步中。你可以在Cheyenne網站的首頁看到它目前所支援的標準,也可以在此下載它的REBOL源碼(BSD授權方式)或執行檔(Windows、Linux、Mac OS)。請注意,如果你要透過源碼執行Cheyenne,請使用REBOL 2.x版,而非REBOL 3.0版。
2008年6月16日
閱讀REBOL源碼
我記得十多年前學習Borland OWL時,由於參考資料不多,我必須閱讀源碼才能獲得更進一步的資訊。當時意外的收穫是,我的C++功力大增。
當參考資料不足時,我們就必須閱讀源碼。最近我開始感覺到有閱讀REBOL源碼的必要,因為REBOL 3.0正在開發階段,大家不是很有空去寫DocBase的文件,而DocBase的文件我已經看得差不多了。
除了action和native之外,其實REBOL將所有的源碼都公開。你可以利用source函數或probe函數取得源碼。或者用下面的方式,將全部的源碼都輸出到一個檔案(例如C:\R-Source.txt):
write %/c/R-Source.txt to-binary mold system
請在「完全乾淨」的REBOL console在做上面的動作,也就是說,開始一個新的REBOL console,然後馬上做這個動作。如果你先執行過一些敘述,可能會造成你的系統環境受到污損(contaminated)。
這個檔案雖然不小,但是其中有相當多重複的地方。例如system/contexts/system、system/contexts/export、system/contexts/current、system/words是完全一樣的內容,將重複的內容刪除之後,你會發現檔案變小許多。
然後你就可以開始閱讀REBOL的源碼了。閱讀大師寫的源碼,有助於自己未來成為大師。
當參考資料不足時,我們就必須閱讀源碼。最近我開始感覺到有閱讀REBOL源碼的必要,因為REBOL 3.0正在開發階段,大家不是很有空去寫DocBase的文件,而DocBase的文件我已經看得差不多了。
除了action和native之外,其實REBOL將所有的源碼都公開。你可以利用source函數或probe函數取得源碼。或者用下面的方式,將全部的源碼都輸出到一個檔案(例如C:\R-Source.txt):
write %/c/R-Source.txt to-binary mold system
請在「完全乾淨」的REBOL console在做上面的動作,也就是說,開始一個新的REBOL console,然後馬上做這個動作。如果你先執行過一些敘述,可能會造成你的系統環境受到污損(contaminated)。
這個檔案雖然不小,但是其中有相當多重複的地方。例如system/contexts/system、system/contexts/export、system/contexts/current、system/words是完全一樣的內容,將重複的內容刪除之後,你會發現檔案變小許多。
然後你就可以開始閱讀REBOL的源碼了。閱讀大師寫的源碼,有助於自己未來成為大師。
2008年6月13日
MAP-INNER and MAP-OUTER are killing me
我一直搞不懂MAP-INNER與MAP-OUTER要如何使用,也沒有文件說明可以閱讀。我在動手寫程式做了一些實驗之後,終於放棄了。我於是定義了下面的函數(取得某個gob的絕對座標):
以後我打算只使用MAP-EVENT和abs-offset?,不再碰觸令人痛苦不已的MAP-INNER與MAP-OUTER。
abs-offset?: func [ gob [gob!] ] [
negate second map-inner gob 0x0
]
以後我打算只使用MAP-EVENT和abs-offset?,不再碰觸令人痛苦不已的MAP-INNER與MAP-OUTER。
2008年6月12日
對Object!進行Append與Length?
REBOL 3.0現在允許擴充(extend)物件(object!),如下所示:
上面的例子中,[ b 2 c 4] 也可以寫成 [ b: 2 c: 4],效果一樣。
如果Block內的word和Object內的word相同時,會造成修改的效果。例如:
上面的例子,由於obj本來就有c,所以append之後,c的值會被改變。
特別注意,這些處理series的函數中,只有append可以用在物件上,remove、insert並不適用於物件。我猜想可能是因為remove、insert會讓context內部binding對應的方式亂掉。
Block不會先被reduce,如果有reduce的必要,必須自己來。這個時候,通常會使用compose或reduce/no-set,例如:
想知道某物件有多少Word,可以利用Length?,例如:
效果相當於「length? words-of obj」。
>> obj: context [ a: 1 ]
== make object! [
a: 1
]
>> append obj [ b 2 c 4]
== make object! [
a: 1
b: 2
c: 4
]
上面的例子中,[ b 2 c 4] 也可以寫成 [ b: 2 c: 4],效果一樣。
如果Block內的word和Object內的word相同時,會造成修改的效果。例如:
>> append obj [c 3]
== make object! [
a: 1
b: 2
c: 3
]
上面的例子,由於obj本來就有c,所以append之後,c的值會被改變。
特別注意,這些處理series的函數中,只有append可以用在物件上,remove、insert並不適用於物件。我猜想可能是因為remove、insert會讓context內部binding對應的方式亂掉。
Block不會先被reduce,如果有reduce的必要,必須自己來。這個時候,通常會使用compose或reduce/no-set,例如:
>> append obj reduce/no-set [ d: 365 + now ]
== make object! [
a: 1
b: 2
c: 3
d: 12-Jun-2009/22:56:29+8:00
]
想知道某物件有多少Word,可以利用Length?,例如:
>> length? obj
== 4
效果相當於「length? words-of obj」。
2008年6月11日
My REBOL 3.0 Wishlist
- More text encoders/decoders (Big5, GB2312, ... )
- Unicode text rendering
- Unicode text input from keyboard
- Plug-in ( for calling native C functions )
Because I am developing:
2008年6月7日
A New VID Prototype – VID 3.4
目前REBOL 3.0的開發焦點在VID。REBOL語言設計者Carl最近在AltME r3-alpha社群討論區表示,為了讓VID具有相當大的客製化(customization)彈性,將對既有的VID雛形系統(Prototype)做出較多深入的改變,然後推出第四個雛形系統(VID 3.4)。
2008年6月6日
DevBase Is Around the Corner
剛剛釋出REBOL 3.0 Alpha 2.100.13,這個版本所做的改變,大多是為了VID和REBOL/Services的需求,而VID和REBOL/Services是DevBase的基石。DevBase是一個Client-Server的系統,Client的使用者介面會用到VID,Client和Server的溝通會用到REBOL/Services。
為了要擴大社群對REBOL開發的貢獻,在REBOL 3.0中,DevBase會擔負起這方面的角色,讓社群可以檢視REBOL的程式碼,修改,呈遞,最後由關鍵的兩三個人決定採用與否。目前DevBase已經在運行中,但是是透過REBOL 2.x。最新釋出的REBOL 3.0 Aplah上頭,也開發了一套DevBase,將會試圖取代REBOL 2.x的DevBase。
REBOL大將Gabriele在AltME上面的r3-alpha社群中提到,經他測試,REBOL 3.0的DevBase已經可以順利運作。我相信,這個月(說不定下週)如果他們發現DevBase一切都穩定的話,就會釋出這個DevBase版本。
為了要擴大社群對REBOL開發的貢獻,在REBOL 3.0中,DevBase會擔負起這方面的角色,讓社群可以檢視REBOL的程式碼,修改,呈遞,最後由關鍵的兩三個人決定採用與否。目前DevBase已經在運行中,但是是透過REBOL 2.x。最新釋出的REBOL 3.0 Aplah上頭,也開發了一套DevBase,將會試圖取代REBOL 2.x的DevBase。
REBOL大將Gabriele在AltME上面的r3-alpha社群中提到,經他測試,REBOL 3.0的DevBase已經可以順利運作。我相信,這個月(說不定下週)如果他們發現DevBase一切都穩定的話,就會釋出這個DevBase版本。
2008年6月5日
Pathologic Obesity in Software
許多人第一次看到REBOL,都會為它小巧的體積感到相當驚訝,畢竟在軟體產業,肥胖已經成了一種通病。幾個月前,我發表了一篇「Pathologic Obesity in Software」(軟體的病態性肥胖),得到不少讀者的共鳴。你可以到這裡閱讀這篇文章。
2008年6月3日
2008年5月30日
使用Console(二)
REBOL預計會有兩個Console,目前已完成的只有文字模式的DevStdIO,而圖形模式的DevConsole短時間之內是不會出現的,看樣子我們得使用DevStdIO好一段時間。「使用Console」 這篇文章有介紹一些用法。除此之外,如果你要使用「複製 / 貼上」功能的話,你必須啟用「快速編輯模式」和「插入模式」。作法如下:
- 用滑鼠右鍵點選REBOL Console視窗的標題列,叫出系統選單。
- 從選單中選取「內容」。你會看到附圖的視窗。
- 將兩個編輯選項(「快速編輯模式」和「插入模式」)都選取。然後按下「確定」。
只要有上面的設定,你就可以用滑鼠選取文字,用滑鼠右鍵複製反白區的文字到剪貼簿;在沒有反白區的情況下,按下滑鼠右鍵可以將剪貼簿的文字貼到Console上。
2008年5月23日
REBOL最新動態:VID、Desktop、REBOL/Services
在Unicode核心開發告一段落,且網路介面與圖形介面也整合進來之後。REBOL科技公司CTO Carl Sassenrath表示,近期的目標是將REBOL桌面和REBOL/Services整合進來,應該不久之後就可以對Alpha小組釋出這個版本,開始測試。
2008年5月20日
利用Delect設計方言
REBOL具有豐富的Literal,除了可以提高程式的「可讀性」和「可寫性」之外,也可以方便設計方言(dialect,也就是所謂的DSL)。這一點是其他語言遠比不上REBOL的。
以往,設計REBOL方言的方式,是利用Parse函數。在REBOL 3.0之後,又多了一個方式,就是利用Delect。Delect是DEcode diaLECT的意思。REBOL內部的方言,許多都是利用Delect做出來的。
大多數的方言,都會定義一些關鍵字(keyword)。每個關鍵字後面可以有0到多個參數。有些時候,這些參數出現的次序無所謂,因為透過型別就可以推測出參數的意義。例如:「Circle 100x100 50」與「Circle 50 100x100」,雖然100x100和50的出現次序不同,但是都可以讓我們認為這是要表達一個「圓心在100x100,半徑是50」的圓。所以處理這類方言的時候,值的次序不重要,重要的是值的型別,這種方言用Delect設計會相當容易。
良好的方言,應該要方便學習與使用。放寬參數的次序,可以幫助使用者學習與使用方言。以上面的Circle例子來說,使用者就不需要牢記,到底是先寫半徑再寫圓心,還是先寫圓心再寫半徑。
關於Delect的用法,請見DocBase的這篇說明。我以後也會寫文章說明Delect的詳細用法。
以往,設計REBOL方言的方式,是利用Parse函數。在REBOL 3.0之後,又多了一個方式,就是利用Delect。Delect是DEcode diaLECT的意思。REBOL內部的方言,許多都是利用Delect做出來的。
大多數的方言,都會定義一些關鍵字(keyword)。每個關鍵字後面可以有0到多個參數。有些時候,這些參數出現的次序無所謂,因為透過型別就可以推測出參數的意義。例如:「Circle 100x100 50」與「Circle 50 100x100」,雖然100x100和50的出現次序不同,但是都可以讓我們認為這是要表達一個「圓心在100x100,半徑是50」的圓。所以處理這類方言的時候,值的次序不重要,重要的是值的型別,這種方言用Delect設計會相當容易。
良好的方言,應該要方便學習與使用。放寬參數的次序,可以幫助使用者學習與使用方言。以上面的Circle例子來說,使用者就不需要牢記,到底是先寫半徑再寫圓心,還是先寫圓心再寫半徑。
關於Delect的用法,請見DocBase的這篇說明。我以後也會寫文章說明Delect的詳細用法。
2008年5月18日
REBOL, Erlang, F#
我在這篇文章中,比較了REBOL、Erlang、F#這三個語言的能力,你可以參考閱讀。為什麼我要不斷地把REBOL拿來和其他語言做比較?因為當別人用Google搜尋「Erlang vs ...」或「F# vs ...」的時候,很可能就會看到這一篇文章,然後會基於好奇心而去研究一下REBOL,然後喜歡上REBOL。
2008年5月2日
RHAE & RRTE
2008年4月20日
Web顏色名稱
REBOL沒有支援標準的Web顏色名稱(共140個)。如果你想使用這些標準顏色名稱,你可以使用下面的定義。從這個顏色名稱的定義中,可以看出文化差異。譬如鮭魚、石板、綠松石、北美印第安人穿的鹿皮軟鞋都可當作顏色名稱,和我們東方社會的習慣差異很大。
詳細的顏色,請參考這個網頁:
詳細的顏色,請參考這個網頁:
do web-colors: [ {愛麗絲藍} AliceBlue: 240.248.255 {古董白} AntiqueWhite: 250.235.215 {水} Aqua: 0.255.255 {海藍寶石} Aquamarine: 127.255.212 {蔚藍} Azure: 240.255.255 {米色} Beige: 245.245.220 {陶器} Bisque: 255.228.196 {黑} Black: 0.0.0 {白杏仁} BlanchedAlmond: 255.235.205 {藍} Blue: 0.0.255 {藍紫} BlueViolet: 138.43.226 {褐} Brown: 165.42.42 {木材} BurlyWood: 222.184.135 {軍官藍} CadetBlue: 95.158.160 {淡黃綠} Chartreuse: 127.255.0 {巧克力} Chocolate: 210.105.30 {珊瑚} Coral: 255.127.80 {矢車菊藍} CornflowerBlue: 100.149.237 {玉米穗絲} Cornsilk: 255.248.220 {緋紅} Crimson: 220.20.60 {青綠色} Cyan: 0.255.255 {暗藍} DarkBlue: 0.0.139 {暗青} DarkCyan: 0.139.139 {暗金黃桿} DarkGoldenRod: 184.134.11 {暗灰} DarkGray: 169.169.169 {暗灰} DarkGrey: 169.169.169 {暗綠} DarkGreen: 0.100.0 {暗卡其} DarkKhaki: 189.183.107 {暗洋紅} DarkMagenta: 139.0.139 {暗橄欖綠} DarkOliveGreen: 85.107.47 {暗橙} DarkOrange: 255.140.0 {暗蘭花} DarkOrchid: 153.50.204 {暗紅} DarkRed: 139.0.0 {暗鮭魚} DarkSalmon: 233.150.122 {暗海綠} DarkSeaGreen: 143.188.143 {暗石板藍} DarkSlateBlue: 72.61.139 {暗石板灰} DarkSlateGray: 47.79.79 {暗石板灰} DarkSlateGrey: 47.79.79 {綠松石} DarkTurquoise: 0.206.209 {暗紫色} DarkViolet: 148.0.211 DeepPink: 255.20.147 DeepSkyBlue: 0.191.255 DimGray: 105.105.105 DimGrey: 105.105.105 DodgerBlue: 30.144.255 FireBrick: 178.34.34 FloralWhite: 255.250.240 ForestGreen: 34.139.34 Fuchsia: 255.0.255 Gainsboro: 220.220.220 GhostWhite: 248.248.255 Gold: 255.215.0 GoldenRod: 218.165.32 Gray: 128.128.128 Grey: 128.128.128 Green: 0.128.0 GreenYellow: 173.255.47 HoneyDew: 240.255.240 HotPink: 255.105.180 IndianRed: 205.92.92 Indigo: 75.0.130 Ivory: 255.255.240 Khaki: 240.230.140 Lavender: 230.230.250 LavenderBlush: 255.240.245 LawnGreen: 124.252.0 LemonChiffon: 255.250.205 LightBlue: 173.216.230 LightCoral: 240.128.128 LightCyan: 224.255.255 LightGoldenRodYellow: 250.250.210 LightGray: 211.211.211 LightGrey: 211.211.211 LightGreen: 144.238.144 LightPink: 255.182.193 LightSalmon: 255.160.122 LightSeaGreen: 32.178.170 LightSkyBlue: 135.206.250 LightSlateGray: 119.136.153 LightSlateGrey: 119.136.153 LightSteelBlue: 176.196.222 LightYellow: 255.255.224 Lime: 0.255.0 LimeGreen: 50.205.50 Linen: 250.240.230 Magenta: 255.0.255 Maroon: 128.0.0 MediumAquaMarine: 102.205.170 MediumBlue: 0.0.205 MediumOrchid: 186.85.211 MediumPurple: 147.112.216 MediumSeaGreen: 60.179.113 MediumSlateBlue: 123.104.238 MediumSpringGreen: 0.250.154 MediumTurquoise: 72.209.204 MediumVioletRed: 199.21.133 MidnightBlue: 25.25.112 MintCream: 245.255.250 MistyRose: 255.228.225 Moccasin: 255.228.181 NavajoWhite: 255.222.173 Navy: 0.0.128 OldLace: 253.245.230 Olive: 128.128.0 OliveDrab: 107.142.35 Orange: 255.165.0 OrangeRed: 255.69.0 Orchid: 218.112.214 PaleGoldenRod: 238.232.170 PaleGreen: 152.251.152 PaleTurquoise: 175.238.238 PaleVioletRed: 216.112.147 PapayaWhip: 255.239.213 PeachPuff: 255.218.185 Peru: 205.133.63 Pink: 255.192.203 Plum: 221.160.221 PowderBlue: 176.224.230 Purple: 128.0.128 Red: 255.0.0 RosyBrown: 188.143.143 RoyalBlue: 65.105.225 SaddleBrown: 139.69.19 Salmon: 250.128.114 SandyBrown: 244.164.96 SeaGreen: 46.139.87 SeaShell: 255.245.238 Sienna: 160.82.45 Silver: 192.192.192 SkyBlue: 135.206.235 SlateBlue: 106.90.205 SlateGray: 112.128.144 SlateGrey: 112.128.144 Snow: 255.250.250 SpringGreen: 0.255.127 SteelBlue: 70.130.180 Tan: 210.180.140 Teal: 0.128.128 Thistle: 216.191.216 Tomato: 255.99.71 Turquoise: 64.224.208 Violet: 238.130.238 Wheat: 245.222.179 White: 255.255.255 WhiteSmoke: 245.245.245 Yellow: 255.255.0 YellowGreen: 154.205.50]
2008年4月9日
REBOL的註解
REBOL的註解,是從英文分號「;」開始,到該行結束為止。例如:
name: "John Doe" ; 預定使用者名稱
你也可以使用comment函數,此函數後面需要一個參數,此參數會被視為註解,不予執行。例如:
comment 100
利用{}字串或 []區塊當參數,comment可以延續許多行,例如:
comment [
多行的註解
]
comment {
多行的註解
}
我們盡量使用{}字串當comment參數,而不要用[]區塊當其參數,因為[]區塊內還是要遵守REBOL型別的規範,不能隨意寫。例如:
comment [
OK :)
]
**Syntax Error
而{}字串就沒有這樣的問題。
comment {
OK :)
}
其實,許多出現comment { … }的地方,都可以將comment省略,直接寫{ … },例如:
pi: 3.14 {圓周率}
這類多餘的值,會被REBOL解譯器丟棄,不會有作用,所以可以當成註解使用。
name: "John Doe" ; 預定使用者名稱
你也可以使用comment函數,此函數後面需要一個參數,此參數會被視為註解,不予執行。例如:
comment 100
利用{}字串或 []區塊當參數,comment可以延續許多行,例如:
comment [
多行的註解
]
comment {
多行的註解
}
我們盡量使用{}字串當comment參數,而不要用[]區塊當其參數,因為[]區塊內還是要遵守REBOL型別的規範,不能隨意寫。例如:
comment [
OK :)
]
**Syntax Error
而{}字串就沒有這樣的問題。
comment {
OK :)
}
其實,許多出現comment { … }的地方,都可以將comment省略,直接寫{ … },例如:
pi: 3.14 {圓周率}
這類多餘的值,會被REBOL解譯器丟棄,不會有作用,所以可以當成註解使用。
訂閱:
文章 (Atom)