最近狀態不佳代碼寫不出來, 補一下 Cirru 的文檔吧
前一篇 Cirru 的一年回顧好像有很多人看, 但整個項目彷佛關注的人很少
我大概梳理一下, 若是有興趣但願有人能幫我探索 Cirru http://cirru.orggit
Cirru 是基於 Lisp 的 S 表達式衍生出來的一套縮進語法
大體就是把括號語法當中跟縮進語義重合的部分給簡化掉了
稍微明確一點的例子, (+ 1 2 (+ 3 4 (+ 5 6)))
到了 Cirru 裏變成了github
+ 1 2 + 3 4 + 5 6
或者上邊的例子不用縮進, 實際上寫出來是:web
+ 1 2 (+ 3 4 (+ 5 6))
就像是每一行開頭結尾的括號都不用了, 僞裝會被自動加上
可是爲了考慮幾個奇怪的寫法, 實際上會有兩個特殊語法編程
+ 1 2 $ + 3 4 $ + 5 6
其中 $
意思就是後面的內容所有算在一個括號裏, 括號管理起來麻煩嘛
而後還有這樣的寫法, 括號後面還有單個的值 (+ 1 (+ 2 3) 4 5)
, 寫成這樣segmentfault
+ 1 + 2 3 , 4 5
其中的逗號 ,
意思是這一行的內容是緊跟在原來的內容後面, 是不打括號的
關於縮進還有個極端的狀況, (let ((a 1) (b 2)) (+ a b))
寫成編程語言
let a 1 b 2 + a b
也就是多層縮進會生成的多個括號, 用來表示 Lisp 特殊的意思
另外還有一個地方容易有誤區, 就是使用引號, 跟通常的語言是不同的編輯器
print |a print "|a" print "|a" "|b" print "|a b"
Cirru 語法裏第一行和第二行是同樣的, 由於引號自己不是用來標記字符串的
引號只是用來對付像是第三行第四行這種想寫的字段中有特殊字符的內容
其實 |a
在 JavaScript 中徹底就是 "a"
, 前面的 |
只是特殊記號而已
在 CirruScript 當中是 :a
在 Sepal.clj 中是 |a
, 你也能夠定義別的符號svg
這確實是很是奇怪的語法, 形成這個狀況的緣由是, Cirru 本來是爲圖形化編輯設計的
我以前嘗試過很多次想作個好用的圖形化編輯器, 但效果不理想ui
後來以爲用文本的語法來作反而現實一點, 反而能在 GitHub 上先用起來
https://github.com/trending?l=Cirru
圖形當中, 每一個葉節點都是一快文本, 引號就不必了, 只有文本須要引號$
和 ,
的縮進和展開, 在圖形上直接就是, 在文本里反而麻煩spa
因此 Cirru 原本想的是把 S 表達式用樹狀的圖形界面作出來的
編程語言解析出來的樹很像是分形的結構
明確一點能夠參考 Let’s Build A Simple Interpreter 裏的圖片來理解
文本形態的 Cirru 語法怎麼解析, 能夠嘗試這裏 JavaScript 寫的例子
http://repo.cirru.org/parser/
若是熟悉 AST 或者解釋器, 會知道這是編程語言實現過程當中很基礎的玩具
事實上最近我也弄出了個微博專門整理關於這方面的資料
http://weibo.com/webassembly
有了 AST, 高級語言生成 AST, 底層代碼又從 AST 生成, 因此很重要
這某種程度也算是 IR: Intermediate Representation(中間表示)
如今我已經用 CirruScript 和 Sepal.clj 來生成 JavaScript 和 Clojure 了
下一步但願用來生成 WebAssembly, 並且已經嘗試了一下
勢單力薄不知能走多遠, 有興趣的同窗能夠關注下, 也歡迎到微博私信我
補充一下省得誤解, Cirru 對應的是語法樹, AST 是指的抽象語法樹
AST 會帶更多信息, ES6 AST 比語法樹複雜一點點, Clojure AST 很是複雜
Lisp 系語言有時說代碼表示 AST, 但也許沒把內部實現說明確, 說不許的
關於 AST 還能夠看下這裏 https://www.zhihu.com/question/20346372