Skip to content

zago programming zh tw

Weizhong Yang a.k.a zonble edited this page Aug 25, 2026 · 16 revisions

zago programming

除了手動按方向鍵畫圖外,zago 內建了一套直覺的文字排版與繪圖命令(Editor LOGO)。您不需要任何程式設計背景,這些命令讀起來就像是自然的編輯動作:在前面提到的 BOXLINE 等命令,其實就是在寫程式!

對於想要撰寫複雜編輯巨集、批次排版腳本,或是與終端機管線(Pipeline)結合的使用者,Editor LOGO 提供了完整的資料型態、陣列與高階清單處理函式。


快捷繪圖與自動化命令

執行命令的方式

  1. ESC 命令列 (Command Line):按 ESC 進入命令列,直接輸入命令按下 Enter 即可執行—例如 box "Hello, zago!"
  2. 在編輯器中直接執行 (Eval at Cursor):在編輯器中將游標移到含有指令的文字行,或是選取一段指令文字(甚至是 Markdown 內的 ```logo 程式碼區塊),按下 Ctrl + Q 即可立刻執行!
  3. 一鍵復原 (Undo):所有指令產生的內容修改,皆可按 Ctrl + Z 一步完整復原。

Headless 模式(命令列直接執行)

不開啟互動式編輯器,直接在終端機執行 LOGO 程式碼並將結果輸出到 stdout,適合用於腳本自動化與管線處理(pipeline)。

  • -e / --eval:直接執行一段 LOGO 程式碼字串。

    zago -e 'REPEAT 3 [ TYPE "Hello" NEWLINE ]'
  • -s / --script / --run:執行指定的 LOGO 腳本檔案。

    zago --script my_script.logo

最常用的文字輸出與狀態列指令 (TYPESHOW)

在輸入指令時,最基礎且最常用到的就是 TYPESHOW

  • TYPE "內容(或 PRINT):將指定的文字或計算結果,直接打在編輯器游標所在的位置(會寫入檔案,不自動換行)。
    • TYPE "Hello(在游標位置插入 Hello)
    • TYPE :title(將變數 :title 的文字打在畫面上)
    • REPEAT 5 [ TYPE "* " ](連續打出 5 個星號)
    • NEWLINE(在游標處換行)
  • SHOW "內容:在螢幕底部的狀態列顯示提示訊息或數值,不會修改檔案內容。
    • SHOW "Done!(在底部狀態列顯示 Done!)
    • SHOW :w(在底部狀態列顯示變數 :w 的數值)

海龜筆觸控制 (Turtle Primitives)

如果您習慣像是持筆劃線的控制方式,也可以使用海龜控制指令:

  • PD (Pen Down 下筆) / PU (Pen Up 提筆):下筆狀態下移動海龜會自動劃出 ANSI 框線,並自動進行轉角與 T 型接頭融合。
  • FD 距離 / BK 距離:前進 / 後退指定字元距離。
  • RT 角度 / LT 角度:右轉 / 左轉 90 度。
  • SETH 朝向:設定朝向(UP, DOWN, LEFT, RIGHT)。

常用自動化小技巧

當您的文件排版需求變大時,zago 也提供變數、迴圈與巨集,幫助您自動化重複的工作:

變數 (MAKE:變數)

MAKE "w 20
BOX :w 4 ROUND

取得游標位置與狀態 (ROW, COL, GETLINE)

在撰寫較複雜的排版巨集時,常需要記錄目前的游標位置,繪圖後再回到原位,或是取得目前行的文字內容:

  • 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

重複執行與清單走訪 (REPEATFOREACH)

在迴圈或走訪清單時,zago 提供幾個方便的內建記號,讓您不用手動管理計數器:

  • :#(或 :repcount:在 REPEAT 迴圈中,:# 代表目前的「迴圈次數」(從 1 開始,如 1, 2, 3...)。
    • REPEAT 5 [ TYPE :# TYPE ". Item " ] $\rightarrow$ 在檔案中自動打出 1. Item 2. Item 3. Item 4. Item 5. Item
  • ?(或 ?1:在 FOREACHMAP 走訪清單時,? 代表「目前走訪到的這項內容」。
    • 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 ... END)

您可以使用 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"
遞迴呼叫範例 (Recursion)

自訂程序可以使用 OUTPUT 回傳數值,或使用 STOP 中斷執行,輕鬆寫出遞迴邏輯:

# 遞迴計算階乘 (Factorial)
TO FACTORIAL :n
  IF :n <= 1 [ OUTPUT 1 ]
  OUTPUT :n * FACTORIAL (:n - 1)
END

SHOW FACTORIAL 5    ; 底部狀態列顯示 120

進階 Editor LOGO

資料型態與表示法

Editor LOGO 支援以下幾種基礎資料型態:

1. 字串與單字 (Words / Strings)

在 LOGO 中,字串可以採用多種靈活的寫法:

  • 前綴雙引號(UCBLogo 慣例):單一單字前加上 " 即可,不需結尾引號(例如 "Hello"round)。
  • 完整雙引號字串:含有空白的文字可以用雙引號包起來(例如 "Hello World")。
  • 裸單字 (Bare Words):在許多繪圖與佈局指令中,可以直接寫文字(例如 BOX HelloGOTO 10 5)。
TYPE "Hello
TYPE "Hello World"
SHOW WORD "Page: " :pageNo

2. 數值與算術運算 (Numbers & Math)

支援整數與浮點數,提供完整的算術運算子與數學函式:

  • 算術運算:+, -, *, /, % (取餘數), ^POWER (次方)
  • 數學函式:SQRT (開根號), ABS (絕對值), ROUND (四捨五入), SIN, COS, TAN
MAKE "w 10 + 5
SHOW :w * 2
SHOW SQRT 16

3. 清單與陣列 (Lists)

清單使用中括號 [ ... ] 包裹,元素間以空白分隔:

  • 清單表示法:[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

高階清單處理與函數 (Higher-Order Functions)

Editor LOGO 支援類似函數式程式語言的高階清單處理指令,非常適合用在複雜的批量排版或資料轉換上:

1. MAP template list (元素轉換)

對清單中的每個元素進行運算,並回傳一個轉換後的新清單(使用 ? 代表目前元素):

MAKE "nums [1 2 3 4]
MAKE "squares MAP [? * ?] :nums
SHOW :squares           ; 狀態列顯示 [1 4 9 16]

2. FILTER template list (條件篩選)

依條件篩選清單內的元素,保留結果為真(非 0)的項目:

MAKE "nums [1 5 12 3 8]
MAKE "bigNums FILTER [? > 5] :nums
SHOW :bigNums          ; 狀態列顯示 [12 8]

3. REDUCE template list (折疊/累加)

將清單元素依指定的二元運算折疊為單一數值(使用 ?1 代表目前累加值,?2 代表下一個項目):

MAKE "nums [1 2 3 4 5]
MAKE "total REDUCE [?1 + ?2] :nums
SHOW :total            ; 狀態列顯示 15

4. SORT list [ASC|DESC] (清單排序)

對數字或字串清單進行自動排序:

SHOW SORT [3 1 4 2 5]           ; 顯示 [1 2 3 4 5]
SHOW SORT DESC ["b" "a" "c"]     ; 顯示 ["c" "b" "a"]

進階流程控制與迴圈

除了 REPEATFOREACH 外,還支援以下流程控制指令:

1. 條件分支 (IFIFELSE)

IF :lineCount > 10 [
  SHOW "Document is long"
]

IFELSE :mode == "round" [
  BOX "Title" ROUND
] [
  BOX "Title" DOUBLE
]

2. WHILEUNTIL 迴圈

當條件成立時持續重複執行區塊:

MAKE "i 1
WHILE [ :i <= 5 ] [
  TYPE :i TYPE " "
  MAKE "i :i + 1
]

3. FORDOTIMES 範圍迴圈

  • 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 是否有修改(回傳 10)。
# 自動在游標位置插入日期與時間標籤
TYPE "Created at: "
TYPE DATE
TYPE " "
TYPE TIME

搭配 UNIX pipe 使用

您可以將 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 ║
╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

Clone this wiki locally