Skip to content

Instantly share code, notes, and snippets.

@nowherekai
Created September 17, 2016 08:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nowherekai/14c0b492e0a78a58540583b201e71e62 to your computer and use it in GitHub Desktop.
Save nowherekai/14c0b492e0a78a58540583b201e71e62 to your computer and use it in GitHub Desktop.
;see http://www.yinwang.org/blog-cn/2012/08/01/interpreter
; Clojure 实现的一个简单解释器,是dynamic scope 的
(def env0 {})
(defn ext-env [x v env]
(assoc env x v))
(defn lookup
""
[x env]
(env x))
(def env0 {})
;; 解释器的递归定义(接受两个参数,表达式 exp 和环境 env)
;; 共 5 中情况
(defn myeval
[exp env]
(println (str "debug: " exp " ,env: " env))
(cond
(symbol? exp) (let [v (env exp)]
(cond
v v
:else (throw (Throwable. (str "variable undefined" exp))))) ;变量
(number? exp) exp
(= (first exp) 'lambda) exp
(list? (first exp)) (let [[_ [x] body] (myeval (first exp) env0)
v (myeval (second exp) env0)
]
(myeval body (ext-env x v env0)))
:else (let [[op exp1 exp2] exp ;算数表达式
v1 o(myeval exp1 env
)
v2 (myeval exp2 env
)]
(cond
(= op '+) (+ v1 v2)
(= op '-) (- v1 v2)
(= op '*) (* v1 v2)
(= op '/) (/ v1 v2)
))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment