某個號稱三歲以上就可以玩的桌游,抽象之后的基本問題就是在一個區域中如何擺放三種形狀(朝向隨意)。
比如區域:
三種形狀(短折,長折,一字),各種朝向如下:
這是迄今為止用木蘭語言編寫的最復雜的實用代碼,包括一個遞歸搜索,長約 150 行,測試約 70 行。其中一個類如下:
細節和算法有很大改進空間,歡迎指教。
期間根據需要復現了木蘭的如下功能:
== 操作符重載
type 點 { func $點(橫, 縱) { self.橫, self.縱 = 橫, 縱 } operator == (另一點) { return self.橫 == 另一點.橫 and self.縱 == 另一點.縱 } }
可指定函數返回類型
type Person { { name = "小白" } func $__init__(name) { self.name = name } } func shout(id): Person { return Person(id) } print(shout("Mulan1").name)
根據范圍取子列表
比如 a[1:3], a[1:]
添加內置函數
集合(set)、斷言(assert)、all、str/int 等等
代碼統計下面是幾個主要部分的代碼行數統計,格式為:兩周前 ->本周。
測試
test 語法樹 . py,確保生成的語法樹與原始版本一致:67
木蘭測試用例:1228 -> 1590
運行測試 . py,檢驗所有木蘭測試代碼片段:151 -> 154
未變
實現:2130 -> 2183
演示高亮 . py:100
功用 / 反饋信息 . py:45
分析器 / 語法分析器 . py:916 -> 944
分析器 / 語法樹 . py,功用 / 調試輔助 . py,包括對 ast 庫的中文封裝:284 -> 234 + 56 = 290
分析器 / 詞法分析器 . py:187 -> 190
環境 . py,加載木蘭模塊:89 -> 97
中 . py,主程序:35 -> 36
未變
下一步由于還有相當部分的木蘭語言功能尚未補全,而實踐證明編寫較復雜實例的開銷相對較大,于是打算首先盡快補完語言功能和測試用例。
現在個別語言功能上卡了殼(比如變長參數),主要是看不出如何使用。如果有興趣并且對 Python 比較熟悉,歡迎一道研究。