- Wiki https://en.wikipedia.org/wiki/Expression_problem
- quote 161124e300feec https://www.zhihu.com/question/26957934/answer/34703103
- Chinese introduction http://mgampkay.github.io/posts/an-introduction-to-the-expression-problem.html
- 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 sample code
ns app.main
defrecord %expr-methods :eval
def %const $ %{} %expr-methods
:eval $ fn (tp)
nth tp 1
def %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
Run example:
=>> bundle_calcit && cr -1
file created at ./compact.cirru
calcit_runner version: 0.4.16
1
3
(Const 1 )
1
(BinaryPlus 1 2 )
3
took 7.997ms: nil
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。