作者: ronin728 (浪人) 看板: PLT
標題: [閒聊] Multi-methods
時間: Tue Nov 8 18:01:55 2016
寫作業有感,
我今天來嘴炮一下我對程式語言抽象能力的看法 XD
小劇場
"""
資工系學生小明正在設計一個 ML 語言的編譯器,
他設計了一套語義系統能將 AST 一步步轉成組合語言,
他選擇了用 C++/Java 來實(自)現(虐),
但同時他也不想用寫好幾座 if-else 金字塔,
他希望 C++/Java 能像 Haskell 一樣
爽爽用 Pattern matching,
也許 Dynamic dispatching 能夠做到類似的效果...?
"""
可惜的是,
C++/Java 只有 Single dispathing,
這種機制所能表達的語法非常有限,
用算用了還是得在 class 中寫一堆 if-else。
若 OOPL 要像 FPL 的 Pattern matching 般便利,
唯一的可能就是使用 Multi-methods(Multi-dispatching)。
可惜的是許多 OOPL 根本就沒有內建支援,
例如 C++、Java、Python、Ruby ...
這些語言需要靠一些技巧來摹擬、擴充,才能做到這種功能。
( Bjarne 有提出把 Pattern matching 與
Multi-method 加入 C++ 的作法,詳見最下方的連結)
題外話 自帶 Multi-method 的乖寶寶名單 [
ANSI CL、Racket、Clojure ← 壯哉我大 Lisp
Perl 6 ← 除了$$@@$@之外,我覺得它看起來很討喜
C# 4.0 ← 我覺得微軟的語言設計品味都不算糟糕,
至少 C#、F#、TypeScript 之類的看起來都還不差,
畢竟微軟研究院裏還有 Simon P Jones 等大神坐鎮,
不過 VB、C++/CLI 之類的倒是很不入流.. (逃
]
---------------------------------------------
一門程式語言怎樣去定義、處理 polymorphic 的資料或程式,
這是個非常重要的問題,設計良好的語言在處理這件上會特別方便。
這類問題 Philip Wadler 給了他一個名字"The express problem",
"""
The Expression Problem is a new name
for an old problem. The goal is to
define a datatype by cases, where one can
add new cases to the datatype and new functions
over the datatype, without recompiling existing code,
and while retaining static type safety.
"""
不過我不會以他的定義來討論,我會提到這篇文章
只是因為這個詞用來搜尋討論串比較方便而已 (X)
舉些我認為值得作為指標的兩個例子:
1. 寫一個 Lambda-calculus 的 EDSL
2. 實現 Red-black tree 資料結構
實際寫就知道這種抽象性有多重要了,
用 C++ 與 Haskell 來做對比,
兩者的程式語句數量至少會差個3~5倍。
題外話,用 C++ 寫 Lambda-calculus EDSL,
用 Template meta-programming 的方法來寫
可能會比 Runtime 版本的還要短 XD
https://goo.gl/Fy8D4k
結論:
<del> 1. \LISP大法好/ \ML大法好/ </del>
<del> 2. Open multi-methods 跟 FP 的一些東西有 87% 像 </del>
<del> 3. OOPL 都在加入 FPL 二、三十年前就有的東西來填坑 </del>
<del> 4. 如果 C++ 標準委員會是 Bjarne 獨裁的話,
C++ 可能改名成 OCAML 了,
全名 Objective C Assemble with ML。
</del>
<del> 5. ANSI Common Lisp 比 Smalltalk 更像 OOP 語言 </del>
範例程式碼神馬的,我有空再補... (逃
相關連結:
C++ 的 Pattern matching 擴展 Mach7
https://github.com/solodon4/Mach7
Open Multi-Methods for C++
http://www.stroustrup.com/multimethods.pdf
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.217.197.133
※ 文章網址: https://webptt.com/m.aspx?n=bbs/PLT/M.1478599319.A.AAD.html
※ 編輯: ronin728 (180.217.197.133), 11/08/2016 18:05:13
1F:推 esrever: The express problem 讓我想到 data types àla carte XD 11/09 02:05
以前我在查資料的時候翻過這文章,不過還沒仔細讀過 (掩面
2F:推 suhorng: 有人用 Visitor Pattern 來寫(因為沒 multi dispatch) 11/09 08:12
不過 visitor pattern 還是有他的限制,
如果要配對的形式參數類型超過 1 個,
例如
void show(Red r, Blue b);
void show(Blue b, Green g);
就會很麻煩,要另外拆出來,如果超過 2 個...
程式基本上不是人在讀的了 XDDD
甚至還有 term 數量硬是跟別的兄弟們不一樣的那種
void show(Red r, Blue b, Green g);
我覺得這種情況手動用 dynamic_cast/instanceof
配 if-else 去分派,會比較實在 XD
※ 編輯: ronin728 (180.217.201.117), 11/10/2016 01:06:38
3F:推 xcycl: a la carte 那篇開宗明義就說是處理 expression problem ;) 11/10 15:06
4F:→ alfadick: 你怎麼看Wolfram Language 11/12 12:11