iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
Software Development

離塵指引.卷之一.試結丹:程式語言自舉系列 第 24

音界咒零.二版設計(下)引入「術」、「若」語句

  • 分享至 

  • xImage
  •  

零.一版音界咒已有循序與修改記憶體的能力,再加上決策語句便能完備。

音界咒零.二版選擇的是遞迴,想必道友們並不會太意外,畢竟那句古老的偈語早就深植人心:

遞迴只應天上有,人間該當用迴圈。

在符合「離塵」的寓意之外,實現遞迴也就意味著實現了(函式)此一重要的模組化工具,為構造較大型的程式打下了基礎,其泛用程度相較 gotowhile 又高上了一檔。

概述

零.二版新增「若」語句,以及「術」的定義與施展(調用),並支援「外術」(外部函式),以實現標準輸入輸出。

為輔助「若」語句的使用,亦加入相等、不等、小於......等等比較算子。

檔案的頂層僅允許變數宣告與術宣告,編譯時應可指定第一個要施展的術的名字,若無指定,便先行施展術。

新增算子

比較運算

  • ==
    • 等於
  • !=
    • 異於
  • <=
    • 小於或等於
  • >=
    • 大於或等於
    • 大於
    • 小於

以上算子的求值結果皆為整數,若式子成立,值為1,否則值為0。運算優先級彼此相等,但比加減乘除都還要低。

餘數

取餘數。優先級介於乘除與加減間。

「若」語句

若(甲==乙)【
    ...
】

在括號內條件不為0時,執行【 】內語句,括號內為0時,注意到括號內並不限定是比較算子,可以是任意算式,乃至數字或變數。

貧道不採用塵界常見的花括號,是因為全形的花括號並不容易與圓括號區分,貧道自用的微軟正黑體是如此,恐此問題普遍存在,故採【 】,此類括號似乎沒有通用的念法,在此給它取個名吧!

道友請看,此括號一面平,一面弧,若置平面朝下、弧面朝上,便好似能擺放蛋或球體的基座。故吾名之曰基座括號或簡稱基括號

與「若」連用的尚有「或若」、「不然」兩關鍵字。

若(甲>10)【
    ...
】或若(乙==1)【
    ...
】或若(乙==0)【
    ...
】不然【
    ...
】
# 決策結尾

此結構中,唯有當上一層的條件不符合時,才會嘗試下個括號內的條件並執行基括號內的語句。例如,以上法咒唯有在「甲<=10」時才會去檢查「乙==1」,當所有條件都不成立時,就執行不然基括號內的語句。

術.輾轉相除(甲、乙)【
    若(乙==0)【
        歸.甲
    】
    歸.輾轉相除(乙、甲%乙)
】

上例展示一遞迴術——輾轉相除術,以下逐詞解釋:

  1. :關鍵字,由此開頭,定義一術
  2. :音界號,用以區隔關鍵字與術名
  3. 輾轉相除:術名
  4. (甲、乙):參數列表,參數之間以頓號為間隔
  5. :左基括號,術體開始
  6. 若(乙==0)【 歸.甲 】:符合條件時,將甲作為術的求值結果(歸值),結束術。
  7. 歸.輾轉相除(乙、甲%乙):施展輾轉相除(乙、甲%乙),以其歸值為歸值,結束術。
  8. :右基括號,術體結束

在零.二版中,術的參數與歸值(回傳值)都是整數。若在任意分支中,術沒有歸值,編譯器應報錯。

作用域

術在定義之後才能使用,也就是說,不支援術的互相調用。

以下法咒是非法的。

術.甲()【 】
術.乙()【甲()】

外術(外部函式)

支援 打印整數(數) 此一外術,其接受一個整數作為參數,執行後會將該整數送進標準輸出。

法咒執行流程

編譯時應可指定第一個要施展的術的名字,若無指定,便先行施展術。若檔案中無術,編譯失敗。


上一篇
音界咒零.二版設計(上)圖靈完備
下一篇
音界咒零.二版再遇分詞(一)狀態機
系列文
離塵指引.卷之一.試結丹:程式語言自舉31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言