action: 動作 [movement] [doing]
argument: 引數 [refer] [number]
-based: 基底 [base] [base]
binary: 二元 [two] [primary]
bind(ing): 繫結 [bind] [bind]
bitset: 位元集 2x[bit] [set]
block: 區塊 [division] [block]
callback: 回呼
char: 字元 [character] [primary]
closure:
component: 元件 [primary] [thing]
compile(r): 編譯(器)
concurrent: 共時
context: 脈絡
datatype: 資料型別 2x[data] 2x[type]
date: 日期 [day] [a period of time]
decimal: 小數 [little] [number]
dialect: 方言 [local] [language]
email: 電郵, 電子郵件 [electronic] [mail]
-er: 者 員(人), 器 子(程式)
error: 錯誤 [wrong] [mistake]
evaluate: 估算 [estimate] [compute]
event: 事件 [affair] [thing]
export: 匯出 [flow] [out]
file: 檔案 [file] [case]
frame: 框 [frame]
function: 函數 [letter] [number]
get-path: 取徑 [get] [path]
get-word: 取字 [get] [word]
gob: 圖形物件 2x[graphics] 2x[object]
handle: 代碼 [surrogate] [code]
image: 影像 [image] [image]
import: 匯入 [flow] [in]
integer: 整數 [whole] [number]
interface: 介面, 界面
interpret(er): 解譯器
issue: 期號 [issue] [code]
library: 程式庫 2x[program] [base]
list: 清單
lit-path: 原徑 [original] [path]
lit-word: 原字 [original] [word]
logic: 邏輯 [this is transliteration]
map: 對應, 對應表 [pair] [answer]
mezzanine: 中層 [middle] [layer]
module: 模組 [mold] [combination]
money: 錢 [money]
native: 原生, 原生函數 [original] [living]
none: 空, 無 [void]
object: 物件 [thing] [thing]
op: 運算子 2x[operate] [-er]
-or: 者 員(人), 器 子(程式)
-oriented: 導向 [direct] [direction]
pair: 對, 值對 [pair]
parameter: 參數 [refer] [number]
paren:
parse: 剖析 [dissect] [analyze]
path: 路徑 [path] [path]
percent: 百分比 [100] [division] [ratio]
profile: 特徵分析(v), 特徵描述(n)
program: 程式(n), 編程(v)
probe: 探測
prototype: 原型
plug-in: 插件 [plug] [thing]
port: 埠, 港埠 [port]
rebcode: 彙編碼 2x[assembly] [code]
refinement: 修飾 [decorate] [decorate]
routine: 常式 [common] [formula]
set-path: 設徑 [set] [path]
set-word: 設字 [set] [word]
scalable: 規模可變
script: 劇本(n), 編劇(v)
stack: 堆疊 [stack] [stack]
string: 字串 [character] [string]
struct: 結構 [knit] [compose]
tag: 標籤 [mark] [label]
task: 任務 [appointment] [business]
thread: 線程
time: 時間 [time] [period of time]
trace: 蹤跡(n) 追蹤(v)
transaction: 交易
tuple: 值組 [value] [combination]
typeset: 型別集 2x[type] [set]
Unicode: 統一碼 2x[unified] [code]
unset:
url:
utype: 自訂型別 [oneself] [define] 2x[type]
vector: 向量 [direction] [quantity]
VID: 視覺介面方言 2x[visual] 2x[interface] 2x[dialect]
word: 單字 [single] [word]
2008年3月14日
REBOL英中對照表
2008年3月13日
把REBOL當Shell用
所謂的Shell,就是圍繞在OS核心外圍的使用者介面,你可以參考「當劇本遇上殼」這篇文章對Shell的說明。
本文章介紹一些常用的函數與用法,讓你可以將REBOL當作Shell,用來對OS做一些基本的檔案操作。
【目前的目錄】
如果你想知道目前的工作目錄為何,你可以利用what-dir函數,如下:
>> what-dir
== %/c/Documents%20and%20Settings/Jerry%20Tsai/桌面/
「==」表示前面的函數有傳出值,其值為「%/c/Documents%20and%20Settings/Jerry%20Tsai/桌面/」。
你也可以用pwd取代what-dir,效果完全一樣:
>> pwd
== %/c/Documents%20and%20Settings/Jerry%20Tsai/桌面/
REBOL的檔案表示方式,依照下面的規則:
- 開頭使用「%」
- 目錄的分隔符號使用「/」
- 中間如果有特殊字元,則使用「%」後面接著兩個十六進位數字,代表該特殊字元的編碼。以這裡的例子來說,空白的值,在ASCII編碼是十六進位的20。所以寫成%20
- 如果是目錄,則最後是「/」
- 如果是絕對路徑,則開頭的「%」後面會接著一個「/」。如果是相對路徑,則開頭的「%」後面不會出現一個「/」。
【檔案的轉換】
如果你對於上面描述的檔案規則覺得不習慣,可以利用to-local-file,將what-dir傳出的檔案轉成作業系統慣用的格式,作法如下:
>> to-local-file what-dir
== "C:\Documents 20and 20Settings\Jerry Tsai\桌面\"
因為to-local-file的傳出值是字串不是檔案,所以前後加上雙引號「"」。有一個函數和to-local-file做的事剛好事相反的,可以把作業系統檔案字串,轉成REBOL檔案,此函數名為to-rebol-file,範例如下:
>> to-rebol-file "C:\Program Files\"
== %/C/Program%20Files/
【改變目錄】
你可以使用change-dir(或cd)函數,改變目前的目錄,例如:
>> cd %/c/
>> pwd
== %/c/
你也可以利用相對路徑的表示方式(也就是開頭的「%」後面不寫「/」),例如:
>> pwd
== %/c/
>> cd %Program%20Files
>> pwd
== %/C/Program%20Files/
有兩個特殊的相對路徑表示方式:「%.」表示目前的目錄,「%..」表示往上一個目錄。依此類推,「%../../表示往上兩層目錄」。下面是一個範例:
>> pwd
== %/C/Program%20Files/
>> cd %..
>> pwd
== %/c/
【製造目錄】
你可以使用make-dir(或mkdir)函數,製作新的目錄,例如:
>> mkdir %abc/
這表示在目前的目錄下,建立一個abc目錄。再看一個例子:
>> mkdir/deep %/c/rebol/my-script/
這裡的mkdir後面緊接著出現「/deep」,意思是:在建立此目錄的過程中,如果有其他的目錄尚未建立,就一併建立。所以如果%/c/rebol/尚未存在,就會先建立%/c/rebol/,然後再建立%/c/rebol/my-script/。
像這種函數後面加上的修飾,我們稱為refinement。
【列出檔案】
你可以使用list-dir(或ls)函數,將某目錄下的檔案列出來,例如:
>> ls %/c/
如果後面沒有寫目錄,預定就是目前的目錄(%.),例如:
>> ls
list-dir(與ls)可以使用下面的refinement:
/l:表示每個檔案用一行顯示
/f:只列出檔案,不列出目錄
/d:只列出目錄,不列出檔案
/r:列出此目錄以及底下所有子孫目錄內的檔案
例如:
>> ls/l/r
當同時使用兩個以上的refinement時,順序無所謂,所以「ls/l/r」和「ls/r/l」是完全一樣的效果。
【取得檔案資訊】
你可以利用「modified?」取得檔案最後修改時間,用「size?」取得檔案大小,用「dir?」得知否為目錄(而非檔案)。例如:
>> modified? %/c/rebol/core.exe
== 5-Mar-2008/6:31
>> size? %/c/rebol/core.exe
== 219136
>> dir? %core.exe
== false
2008年3月10日
各種函數的區別
- Function!
- Closure!
- Rebcode!
- Native!
- Action!
- Op!
- Routine!
屬於Function!、Closure!、Rebcode!型別的函數,都可以利用source函數來觀看其源碼(source code)。例如,在REBOL console中輸入「source what」,就可以看what的源碼:
屬於Native!、Action!、Op!型別的函數,都「無法」利用source函數來觀看其源碼,因為它們的程式是用C語言寫的,經過編譯。至於Routine!,是用來連接到外部動態連結程式庫的函數,REBOL 3.0尚未決定是否要支援Routine!。
Native!、Action!、Op!都是REBOL系統內部內建的函數,我們無法在REBOL程式中自行定義這些函數。Routine!只是用來和外部的程式做連結,我們也無法在REBOL程式中定義它的邏輯。我們在REBOL程式中,能夠自行定義的函數,只有Function!、Closure!、Rebcode!。
一般來說,我們寫REBOL程式時,定義的函數是Function!。如果希望執行過後,函數內的context能夠保留,就不要使用Function!,改用Closure!,缺點是效率會比較差。如果希望函數的執行速度提高,就不要使用Function!,改用Rebcode!,但是Rebcode!不是使用REBOL語言,而是使用Rebcode方言,相當於REBOL虛擬機器的組合語言。使用Rebcode!的缺點是,程式比較不容易讀寫(因為Rebcode方言比REBOL語言更低階的緣故)。
Native!和Action!的差別只會影響REBOL內部,和我們沒有關係,所以可以不用理會它們的差異。Op!比較特別的地方在於,它是中序的(infix),而其他六種函數都是前序的(prefix)。
閱讀REBOL文件或書籍時,請注意。當提到「函數」時,有可能泛指所有的七種函數,也有可能單指function!,必須利用前後文來判斷為何者。如果提到mezz,則一定指function!。如果提到「原生函數」,有可能泛指native!、action!、op!,也有可能單指native!。
使用Windows Console
REBOL預計會有兩個Console,一個是文字模式的DevStdIO,一個是圖形模式的DevConsole。目前已完成的只有DevStdIO。在Windows作業系統上,DevStdIO也就是Windows console。因此,你需要知道Windows Console的基本用法,整理如下:
- 左右方向鍵:在目前的命令列左右移動編輯游標。
- Ctrl+左右方向鍵:按住Ctrl鍵不放開,再按下向左方向鍵,或向右方向鍵,在目前的命令列左右移動編輯游標,一次移動一個word,而不是一個字元。
- Home:將編輯游標移動到目前命令列的開頭。
- End:將編輯游標移動到目前命令列的尾端。
- 上下方向鍵:調出歷史命令(之前輸入過的命令)。
- 插入(Ins)鍵:在字元插入與字元覆蓋(overwrite)模式之間切換。
- 刪除(Del)鍵:刪除游標後的字元。
- 倒退(Backspace)鍵:刪除游標前的字元。
- F7:在文字視窗內,躍出一個「命令歷史清單視窗」(如上圖所示),然後使用上下鍵選取命令,最後按下Enter執行命令。除了F7,我發現F2、F3、F4、F9也有特殊功能。
- Ctrl+空白鍵:中文輸入切換。
- 用滑鼠拖檔案進來:可以輸入該檔案的全名。
可惜的是目前還不能使用tab,進行補完(completion)。
想要離開此console,使用q或quit函數即可,如下所示:
>> quit
2008年3月9日
DevCon 2008在布拉格的夏天
REBOL DevCon研討會第一次是2005年在美國,第二次是2007年在法國,第三次就是今年。地點的選擇顯然是考慮到使用者的多寡。目前REBOL開發者最多的國家,似乎依序就是美國、法國、捷克(首都布拉格)。
今年的研討會重點應該就是REBOL 3.0。我想選擇9月的意義,或許代表9月時3.0可以正式推出。這雖然是臆測,但可能性很高。