Expression Problem 和 Calcit 相关引用笔记

Calcit 示例代码

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

运行示例:

=>> 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

你可能感兴趣的:(Expression Problem 和 Calcit 相关引用笔记)