Swift Haskell 等可以自定義運算子的語言(不僅是過載),實現編譯器時跟其他語言有什麼區別?

時間 2021-05-06 19:22:27

1樓:深海

其他語言我不太了解, 簡單說一下 Swift 的實現.

Swift / Haskell 還有不少函式式語言實現運算子的思路是一樣的: 規定運算子必須由某些特殊字元構成, 且這些字元和構成識別符號 (identifier) 的字符集的交集為空. 這樣一來, lexer 就很簡單了, 和傳統編譯器沒差.

除了中綴 (二元) 運算子, Swift 裡還可以自定義字首和字尾 (一元) 運算子. 手法其實比較粗暴, 它要求中綴運算子兩邊必須同時空格 / 不空格 (e.g.

合法, 也合法, 但 或 就不合法), 單邊不空格的運算子會被識別成和其運算元粘連的前 / 字尾運算子.

換句話說, 在 lex / parse 階段, 你需要額觀察一些東西: 空白、注釋、行首、行尾等等. 在手寫的自頂向下的解析器裡隨便改改應該就可以了, 我管這種東西叫 「帶 hack 的 LL(*)」, 不含高深內容, 而且也不用回溯.

運算子序列 (比如 ) 在解析階段是處理不了的, 編譯器通過詞法定義, 可以知道誰是運算子, 但還不知道這些運算子有沒有被定義過? 如果被定義了, 優先順序是多少? 結合性是什麼?

它只能暫時生成乙個線狀的 AST, 等語義分析階段再將它轉換為和普通雙參函式呼叫一樣的樹狀結構.

src:

1+2*3/4

lex:

1 + 2 * 3 / 4

parse:

op_seq1 - + - 2 - * - 3 - / - 4

sema:

bin_exp1 + bin_expbin_exp / 42 * 3

上邊 parse 到 sema 那部分的演算法沒什麼難度, 不同的語言也有不小的區別, 我就不展開講了. 我當時剛做的時候被結合性和賦值符的特殊情況搞得很煩, 改了一整晚上才弄對. 還被某人嘲笑了 ((((((

Swift 裡定義運算子時可以為它指定乙個優先順序組, 而乙個優先順序組則可以定義它比哪些優先順序組高, 比哪些優先順序組低, 這樣一來, Swift 中的優先順序組就形成了乙個偏序集. 這比用數字定義的優先順序更合乎邏輯:

計算機中的數字 (包括浮點數) 都不具備稠密性, 只要你定義的運算子稍微多一點, 就很容易陷入數字用盡的窘境. 大家習慣性的二分法會加劇這個過程, 有些語言把優先順序的數字擴大到千或萬數量級, 其實根本不解決問題.

數字表示會導致兩個無依賴關係的庫之間的運算子相對於對方仍然有優先順序, 這是有待商榷的做法.

我覺得這點倒是乙個很值得其他語言學習的特性.

思考題: 如果把運算子視為函式, 那短路運算子在非惰性求值的語言中就需要額外的機制來處理, Swift 是如何處理的?

極度無聊的思考題: 下列哪個運算子在 Swift 5.3 的標準庫中沒有定義?

a. >=}" eeimg="1"/>, b. }" eeimg="1"/>, c. , d. , e. , f. , g.

2樓:藥罐子千里冰封

運算子優先順序沒法寫死了就。這裡批評一下Julia,他寫死了上百個運算子的優先順序結合性,然後assume你只用得到這麼多。

3樓:Belleve

你可以看看 Agda 作者寫的 http://www.

cse.chalmers.se/~nad/publications/danielsson-norell-mixfix.pdf

,這玩意不僅可以自定義運算子還可以自定義括弧……

蘆薈 吊蘭等植物是否可以除甲醛?

住綠 指望植物除甲醛,基本上跟指望乙個沙堆能填海差不多。以吊蘭為例,研究人員過模擬含有甲醛的居室,實驗得到的吸收效率來看,吊蘭處理甲醛的平均速度是1平方公尺的葉片每小時處理0.15毫克的甲醛。你想一下一盆吊蘭的葉片面積有多大。通常一株的吊蘭的葉面積不足0.1平方公尺。我們以一棵吊蘭1天之內能處理的甲...

iPhone 螢幕真的可以抵禦鑰匙 螺絲等尖銳金屬物的刮擦嗎?

王二 一直並沒有覺得iPhone的螢幕非常硬,反而是很容易刮花。因為不喜歡貼膜使用手機,並且經常與鑰匙火機放在一起,所以螢幕會很快的就有劃痕。前幾部iPhone已經慘不忍睹了,新的iPhone7也有幾道非常深的痕跡了。 真讚感謝實驗黨 胡維 我考慮半天最終沒敢對我的mini比劃一下不過以前我把資料線...

死亡證是否可以不辦?如果可以,在法律上是否等同於永生?

六華 法律是以現實為基礎的,即使不辦死亡證,當久久聯絡不到相應的人,就會登出其戶口,當其己死的,也就是說不可能存在法律上的永生。 胡樹森 開具死亡證明,無非是為了 繼承 再婚 提取某些財產 比如死者的公積金,喪葬費等 申請遺屬的撫慰金 補償金等 沒有上述內容的,不開死亡證明,確實也無所謂。那麼,人已...