• 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