File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -65,6 +65,15 @@ export default defineConfig({
6565 } ,
6666 ] ,
6767 } ,
68+ {
69+ text : "音界咒零.二版:極簡圖靈完備" ,
70+ items : [
71+ {
72+ text : "設計與概述" ,
73+ link : "/零.二版/設計與概述.md" ,
74+ } ,
75+ ] ,
76+ } ,
6877 {
6978 text : "雜項" ,
7079 items : [
@@ -74,6 +83,15 @@ export default defineConfig({
7483 } ,
7584 ] ,
7685 } ,
86+ {
87+ text : "用語" ,
88+ items : [
89+ {
90+ text : "用語對照" ,
91+ link : "用語對照.md" ,
92+ } ,
93+ ] ,
94+ } ,
7795 ] ,
7896
7997 socialLinks : [
Original file line number Diff line number Diff line change 1+
2+
3+ ## 零.二版引入
4+
5+ ### 術
6+ 函式
7+
8+ ### 外術
9+ 外部函式
10+
11+ ### 基括號
12+ 〖〗
Original file line number Diff line number Diff line change 1+ 零.一版是沒法自舉的,它甚至難以稱之為「咒」。「咒」必須圖靈完備,圖靈完備之後,才有條件自舉。
2+
3+ 在零.二版,貧道將嘗試定義一極度簡單但圖靈完備的法咒。
4+
5+ ## 圖靈完備
6+ 圖靈機有一套嚴謹的符號定義,但貧道不打算在此細述,首先,雖然當代電腦/通用法咒(程式語言)都圖靈完備,但這套原始的符號定義與現今的計算機/法咒有不小的差異,需要一些推導才能證明兩者是等價的。
7+
8+ 基本上,首先想像有一個「咒指針」指向法咒正在執行的行數,法咒只要有語句能控制
9+
10+ - 循序,即咒會一行一行往下執行(咒指針遞增)
11+ - 修改記憶體狀態
12+ - 決策,可根據「條件」決定咒指針要跳躍至何處
13+ - 這個「條件」是「當下記憶體狀態」的函數
14+
15+ 就圖靈完備了。
16+
17+ 編譯器生成真言後,放到真實機器上本就會逐步執行,因此循序不會是問題,只要檢視後兩條即可
18+
19+ 以 C 語言為例
20+
21+ - 賦值語句能修改記憶體狀態
22+ - ` if ` 搭配 ` goto ` 能根據條件選擇性跳躍到任意一行
23+
24+ 決策有很多種實現,` if ` 必不可少,用 ` if ` 搭配 ` goto ` 當然是最直觀符合定義的,但 ` while ` 也能取代 ` goto ` ,可證明 ` while ` 與 ` goto ` 的能力等價。思路是嘗試找到一種方法把 ` while ` 轉換為 ` goto ` ,同時找到一套方法把 ` goto ` 轉換為 ` while ` 。
25+
26+ 除了 ` goto ` 與 ` while ` ,遞迴也是一種與 ` if ` 搭配來達到圖靈完備的方法。道友可嘗試將 ` while ` 與遞迴互相轉化來證明。
27+
28+ 而多數流行的法咒會同時提供 ` while ` 與遞迴,乃至迭代器、` for ` 迴圈等等語句,什麼好寫就支援什麼。
29+
30+ ## 設計
31+
32+ 零.一版音界咒已有循序與修改記憶體的能力,再加上決策語句便能完備。
33+
34+ 音界咒零.二版選擇的是** 遞迴** ,想必道友們並不會太意外,畢竟那句古老的偈語早就深植人心:
35+
36+ > 遞迴只應天上有,人間該當用迴圈。
37+
38+ 在符合「離塵」的寓意之外,實現遞迴也就意味著實現了** 術** (函式)此一重要的模組化工具,為構造較大型的程式打下了基礎,其泛用程度相較 ` goto ` 、` while ` 又高上了一檔。
39+
40+ ## 概述
41+
42+ 零.二版新增「若」語句,以及「術」的定義與施展(調用),並支援「外術」(外部函式),以實現標準輸入輸出。
43+
44+ 此外,為輔助「若」語句的使用,亦加入相等、不等、小於......等等比較算子。
45+
46+ ### 新增算子
47+
48+ #### 比較運算
49+ - ` == `
50+ - 等於
51+ - ` != `
52+ - 異於
53+ - ` <= `
54+ - 小於或等於
55+ - ` >= `
56+ - 大於或等於
57+ - ` > `
58+ - 大於
59+ - ` < `
60+ - 小於
61+
62+ 以上算子的求值結果皆為整數,若式子成立,值為1,否則值為0。
63+
64+ #### 餘數
65+
66+ ` % ` 取餘數。
67+
68+ ### 「若」語句
69+
70+ ``` 音界
71+ 若(甲==乙)〖
72+ ...
73+ 〗
74+ ```
75+ 在括號內條件不為0時,執行〖 〗內語句,括號內為0時,注意到括號內並不限定是比較算子,可以是任意算式,乃至數字或變數。
76+
77+ 貧道不採用塵界常見的花括號,是因為全形的花括號並不容易與圓括號區分,貧道自用的微軟正黑體是如此,恐此問題普遍存在,故採` 〖 〗 ` ,此類括號似乎沒有通用的念法,在此給它取個名吧!
78+
79+ 道友請看,此括號一面平,一面弧,若置平面朝下、弧面朝上,便好似能擺放蛋或球體的基座。故吾名之曰** 基座括號** 或簡稱** 基括號** 。
80+
81+ 與「若」連用的尚有「或若」、「不然」兩關鍵字。
82+
83+ ``` 音界
84+ 若(甲>10)〖
85+ ...
86+ 〗或若(乙==1)〖
87+ ...
88+ 〗或若(乙==0)〖
89+ ...
90+ 〗不然〖
91+ ...
92+ 〗
93+ # 決策結尾
94+ ```
95+
96+ 此結構中,唯有當上一層的條件不符合時,才會嘗試下個括號內的條件並執行基括號內的語句。例如,以上法咒唯有在「甲<=10」時才會去檢查「乙==1」,當所有條件都不成立時,就執行` 不然 ` 基括號內的語句。
97+
98+ ### 術
99+
100+ ```
101+ 術.輾轉相處(甲、乙)〖
102+ 若(乙==0)〖
103+ 歸.甲
104+ 〗
105+ 歸.輾轉相除(乙、甲%乙)
106+ 〗
107+ ```
108+
109+ 上例展示一遞迴術——輾轉相除術,以下逐詞解釋:
110+
111+ 1 . ` 術 ` :關鍵字,由此開頭,定義一術
112+ 2 . ` . ` :音界號,用以區隔關鍵字與術名
113+ 3 . ` 輾轉相除 ` :術名
114+ 4 . ` (甲、乙) ` :參數列表,參數之間以頓號` 、 ` 為間隔
115+ 5 . ` 〖 ` :左基括號,術體開始
116+ 6 . ` 若(乙==0)〖 歸.甲 〗 ` :符合條件時,將甲作為術的求值結果(歸值),結束術。
117+ 7 . ` 歸.輾轉相除(乙、甲%乙) ` :施展` 輾轉相除(乙、甲%乙) ` ,以其歸值為歸值,結束術。
118+ 5 . ` 〗 ` :右基括號,術體結束
119+
120+ 在零.二版中,術的參數與歸值(回傳值)都是整數。若在任意分支中,術沒有歸值,編譯器應報錯。
You can’t perform that action at this time.
0 commit comments