- Wiki https://en.wikipedia.org/wiki...
- 知乎援用 https://www.zhihu.com/questio...
- 中文简介 http://mgampkay.github.io/pos...
- The Expression Problem and its solutions
- More thoughts on the Expression Problem in Haskell
- 3 ways to solve the expression problem
- The Expression Problem in Rust
- Solving the Expression Problem with Clojure(Protocol)
Calcit 示例代码
ns app.maindefrecord %expr-methods :evaldef %const $ %{} %expr-methods :eval $ fn (tp) nth tp 1def %binary-plus $ %{} %expr-methods :eval $ fn (tp) &let pair $ nth tp 1 + (nth pair 0) (nth pair 1)def %const-2 $ .extend-as %const '%const-2 , :stringify $ fn (tp) str "|(Const " (nth tp 1) "| )"def %binary-plus-2 $ .extend-as %binary-plus '%binary-plus-2' , :stringify $ fn (tp) &let pair $ nth tp 1 str "|(BinaryPlus " (first pair) "| " (last pair) "| )"defn main () echo $ .eval $ :: %const 1 echo $ .eval $ :: %binary-plus $ [] 1 2 echo $ .stringify $ :: %const-2 1 echo $ .eval $ :: %const-2 1 echo $ .stringify $ :: %binary-plus-2 $ [] 1 2 echo $ .eval $ :: %binary-plus-2 $ [] 1 2
运行示例:
=>> bundle_calcit && cr -1file created at ./compact.cirrucalcit_runner version: 0.4.1613(Const 1 )1(BinaryPlus 1 2 )3took 7.997ms: nil