-
Notifications
You must be signed in to change notification settings - Fork 3
zago programming zh tw
除了手動按方向鍵畫圖外,zago 內建了一套直覺的文字排版與繪圖命令(Editor LOGO)。您不需要任何程式設計背景,這些命令讀起來就像是自然的編輯動作:在前面提到的 BOX、LINE 等命令,其實就是在寫程式!
對於想要撰寫複雜編輯巨集、批次排版腳本,或是與終端機管線(Pipeline)結合的使用者,Editor LOGO 提供了完整的資料型態、陣列與高階清單處理函式。
-
ESC 命令列 (Command Line):按
ESC進入命令列,直接輸入命令按下Enter即可執行—例如box "Hello, zago!"! -
在編輯器中直接執行 (Eval at Cursor):在編輯器中將游標移到含有指令的文字行,或是選取一段指令文字(甚至是 Markdown 內的
```logo程式碼區塊),按下Ctrl + Q即可立刻執行! -
一鍵復原 (Undo):所有指令產生的內容修改,皆可按
Ctrl + Z一步完整復原。
不開啟互動式編輯器,直接在終端機執行 LOGO 程式碼並將結果輸出到 stdout,適合用於腳本自動化與管線處理(pipeline)。
-
-e/--eval:直接執行一段 LOGO 程式碼字串。zago -e 'REPEAT 3 [ TYPE "Hello" NEWLINE ]' -
-s/--script/--run:執行指定的 LOGO 腳本檔案。zago --script my_script.logo
在輸入指令時,最基礎且最常用到的就是 TYPE 與 SHOW:
-
TYPE "內容(或PRINT):將指定的文字或計算結果,直接打在編輯器游標所在的位置(會寫入檔案,不自動換行)。-
TYPE "Hello(在游標位置插入 Hello) -
TYPE :title(將變數:title的文字打在畫面上) -
REPEAT 5 [ TYPE "* " ](連續打出 5 個星號) -
NEWLINE(在游標處換行)
-
-
SHOW "內容:在螢幕底部的狀態列顯示提示訊息或數值,不會修改檔案內容。-
SHOW "Done!(在底部狀態列顯示 Done!) -
SHOW :w(在底部狀態列顯示變數:w的數值)
-
如果您習慣像是持筆劃線的控制方式,也可以使用海龜控制指令:
-
PD(Pen Down 下筆) /PU(Pen Up 提筆):下筆狀態下移動海龜會自動劃出 ANSI 框線,並自動進行轉角與 T 型接頭融合。 -
FD 距離/BK 距離:前進 / 後退指定字元距離。 -
RT 角度/LT 角度:右轉 / 左轉 90 度。 -
SETH 朝向:設定朝向(UP,DOWN,LEFT,RIGHT)。
當您的文件排版需求變大時,zago 也提供變數、迴圈與巨集,幫助您自動化重複的工作:
MAKE "w 20
BOX :w 4 ROUND
在撰寫較複雜的排版巨集時,常需要記錄目前的游標位置,繪圖後再回到原位,或是取得目前行的文字內容:
-
ROW(或LINE.NO):取得游標目前的「行號」(從 1 開始數)。 -
COL:取得游標目前的「欄號」(從 1 開始數)。 -
GETLINE:取得目前游標所在行的文字內容(亦可接指定行號如GETLINE 5)。 -
LINECOUNT:取得整個檔案的總行數。
# 1. 記錄目前的游標行號與欄號
MAKE "r ROW
MAKE "c COL
# 2. 移動到其他位置繪圖
GOTO 10 5
BOX "Notice"
# 3. 繪製完成後回到原本的位置
GOTO :r :c
在迴圈或走訪清單時,zago 提供幾個方便的內建記號,讓您不用手動管理計數器:
-
:#(或:repcount):在REPEAT迴圈中,:#代表目前的「迴圈次數」(從 1 開始,如 1, 2, 3...)。-
REPEAT 5 [ TYPE :# TYPE ". Item " ]$\rightarrow$ 在檔案中自動打出1. Item 2. Item 3. Item 4. Item 5. Item
-
-
?(或?1):在FOREACH或MAP走訪清單時,?代表「目前走訪到的這項內容」。-
FOREACH ["Alice" "Bob" "Charlie"] [ BOX ? 10 VLINE 3 ]$\rightarrow$ 依序印出 Alice, Bob, Charlie 的方框
-
-
多變數模板記號
?1,?2,?3:當處理雙變數運算(如REDUCE累加)或多組清單組合(如CROSSMAP組合)時,?1代表第 1 個元素或累加值,?2代表第 2 個元素,以此類推。-
SHOW REDUCE [?1 + ?2] [1 2 3 4]$\rightarrow$ 底部狀態列顯示10(?1為目前累加值,?2為下一個數值)
-
# 印出 1 ~ 3 的編號清單
REPEAT 3 [ TYPE :# TYPE ". " TYPE "Item" NEWLINE ]
# 走訪清單繪製方框
FOREACH ["Alice" "Bob" "Charlie"] [ BOX ? 10 VLINE 3 ]
您可以使用 TO 名稱 :參數1 :參數2 ... END 來自訂組合巨集。巨集內還支援程序遞迴呼叫 (Recursion),可以呼叫自身來處理階層樹狀排版或遞迴運算:
TO CONNECT_BOXES :title1 :title2
BOX :title1
MOVE DOWN
LINE ARROW 6
MOVE LEFT 6
MOVE UP
TYPE " "
BOX :title2
END
# 執行自訂巨集
CONNECT_BOXES "Client" "Server"
自訂程序可以使用 OUTPUT 回傳數值,或使用 STOP 中斷執行,輕鬆寫出遞迴邏輯:
# 遞迴計算階乘 (Factorial)
TO FACTORIAL :n
IF :n <= 1 [ OUTPUT 1 ]
OUTPUT :n * FACTORIAL (:n - 1)
END
SHOW FACTORIAL 5 ; 底部狀態列顯示 120
Editor LOGO 支援以下幾種基礎資料型態:
在 LOGO 中,字串可以採用多種靈活的寫法:
-
前綴雙引號(UCBLogo 慣例):單一單字前加上
"即可,不需結尾引號(例如"Hello或"round)。 -
完整雙引號字串:含有空白的文字可以用雙引號包起來(例如
"Hello World")。 -
裸單字 (Bare Words):在許多繪圖與佈局指令中,可以直接寫文字(例如
BOX Hello或GOTO 10 5)。
TYPE "Hello
TYPE "Hello World"
SHOW WORD "Page: " :pageNo
支援整數與浮點數,提供完整的算術運算子與數學函式:
- 算術運算:
+,-,*,/,%(取餘數),^或POWER(次方) - 數學函式:
SQRT(開根號),ABS(絕對值),ROUND(四捨五入),SIN,COS,TAN
MAKE "w 10 + 5
SHOW :w * 2
SHOW SQRT 16
清單使用中括號 [ ... ] 包裹,元素間以空白分隔:
- 清單表示法:
[1 2 3 4 5]或["Alice" "Bob" "Charlie"] - 清單操作指令:
-
FIRST list:取得第一個元素。 -
LAST list:取得最後一個元素。 -
BUTFIRST list(簡寫BF):取得第一個元素以外的所有元素。 -
BUTLAST list(簡寫BL):取得最後一個元素以外的所有元素。 -
ITEM n list:取得第 n 個元素(1-based)。 -
COUNT list:取得清單的元素總數。 -
ISEQ start end(或RANGE):產生指定範圍的數字清單(例如ISEQ 1 5$\rightarrow$ [1 2 3 4 5])。
-
MAKE "items ["Apple" "Banana" "Cherry"]
SHOW FIRST :items ; 印出 Apple
SHOW ITEM 2 :items ; 印出 Banana
SHOW COUNT :items ; 印出 3
Editor LOGO 支援類似函數式程式語言的高階清單處理指令,非常適合用在複雜的批量排版或資料轉換上:
對清單中的每個元素進行運算,並回傳一個轉換後的新清單(使用 ? 代表目前元素):
MAKE "nums [1 2 3 4]
MAKE "squares MAP [? * ?] :nums
SHOW :squares ; 狀態列顯示 [1 4 9 16]
依條件篩選清單內的元素,保留結果為真(非 0)的項目:
MAKE "nums [1 5 12 3 8]
MAKE "bigNums FILTER [? > 5] :nums
SHOW :bigNums ; 狀態列顯示 [12 8]
將清單元素依指定的二元運算折疊為單一數值(使用 ?1 代表目前累加值,?2 代表下一個項目):
MAKE "nums [1 2 3 4 5]
MAKE "total REDUCE [?1 + ?2] :nums
SHOW :total ; 狀態列顯示 15
對數字或字串清單進行自動排序:
SHOW SORT [3 1 4 2 5] ; 顯示 [1 2 3 4 5]
SHOW SORT DESC ["b" "a" "c"] ; 顯示 ["c" "b" "a"]
除了 REPEAT 與 FOREACH 外,還支援以下流程控制指令:
IF :lineCount > 10 [
SHOW "Document is long"
]
IFELSE :mode == "round" [
BOX "Title" ROUND
] [
BOX "Title" DOUBLE
]
當條件成立時持續重複執行區塊:
MAKE "i 1
WHILE [ :i <= 5 ] [
TYPE :i TYPE " "
MAKE "i :i + 1
]
-
FOR [變數 起始 結束 步長] [ 區塊 ]:FOR [i 1 5 1] [ TYPE :i TYPE ". " ] -
DOTIMES [變數 次數] [ 區塊 ](從 0 執行到 count - 1):DOTIMES [i 3] [ TYPE :i TYPE " " ; 打出 0 1 2 ]
Note
為了避免無窮迴圈與遞迴炸堆疊造成編輯器卡死,zago 的所有迴圈設有 10,000 次最大執行次數限制,程序遞迴呼叫 (Procedure Recursion) 也設有 256 層最大呼叫深度限制。若超過限制,編輯器會安全終止並在狀態列發出警示。
在寫檔案標頭、日誌或範本巨集時,可以使用以下系統與文字查詢指令:
-
DATE:回傳當前日期(格式YYYY/MM/DD)。 -
TIME:回傳當前時間(格式HH:mm)。 -
SELECTION:回傳目前在編輯器中選取的文字內容。 -
ISMODIFIED:查詢目前 Buffer 是否有修改(回傳1或0)。
# 自動在游標位置插入日期與時間標籤
TYPE "Created at: "
TYPE DATE
TYPE " "
TYPE TIME
您可以將 zago 與其他 UNIX 工具結合使用,透過管線 (pipe) 將文字輸入到 zago,或將 zago 的輸出導向其他程式。這使得 zago 不僅是一個互動式編輯器,也能作為文字處理的自動化工具。
使用 pipe 將文字傳送到 zago -e 時,會在 zago 編輯器中的 buffer 填入這些文字。您可以用 BUFFERTEXT 命令取得這些文字,如果您不需要保留這些文字,可以在存入變數後使用 CLEARBUFFER 清除 buffer 內容。
例如:
uname -a | zago -e 'make "c buffertext clearbuffer move end nl box trim :c double'可以繪製出這樣的 ASCII 框線內容:
╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ Darwin Mac 25.5.0 Darwin Kernel Version 25.5.0: Tue Jun 9 22:26:22 PDT 2026; root:xnu-12377.121.10~1/RELEASE_ARM64_T8132 arm64 ║
╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝