“评估”;“真的”;Clojure中的元循环评估器
我将元循环计算器的版本转换为Clojure。主要的区别(除了语法)是对环境结构的处理。因为您不能使用“评估”;“真的”;Clojure中的元循环评估器,clojure,scheme,sicp,evaluator,Clojure,Scheme,Sicp,Evaluator,我将元循环计算器的版本转换为Clojure。主要的区别(除了语法)是对环境结构的处理。因为您不能使用设置汽车和设置cdr在Clojure中,这些都是通过持有映射的atom实现的(复制自的代码) 两名评估员的代码可在此处找到: 主程序eval进行案例分析,然后决定下一步如何处理环境env中的表达式exp: (defn eval [exp env] (cond (self-evaluating? exp) exp (variable? exp) (lookup-varia
设置汽车代码>和设置cdr
在Clojure中,这些都是通过持有映射的atom实现的(复制自的代码)
两名评估员的代码可在此处找到:
主程序eval
进行案例分析,然后决定下一步如何处理环境env
中的表达式exp
:
(defn eval [exp env]
(cond (self-evaluating? exp) exp
(variable? exp) (lookup-variable-value exp env)
(quoted? exp) (text-of-quotation exp)
(assignment? exp) (eval-assignment exp env)
(definition? exp) (eval-definition exp env)
(if? exp) (eval-if exp env)
(lambda? exp) (make-procedure (lambda-parameters exp)
(lambda-body exp)
env)
(begin? exp) (eval-sequence (begin-actions exp) env)
(cond? exp) (eval (cond->if exp) env)
(application? exp) (apply (eval (operator exp) env)
(list-of-values (operands exp) env))
:else (throw (Throwable. (str "Unknown expression type \"" exp "\" -- EVAL")))))
与Clojure evaluator交互时,您可以执行以下操作:
;;;评估输入:
(defn hello string hello)
;;; 评估值:
;;; 评估输入:
你好字符串
;;; 评估值:
你好
这表明可以在环境中存储和检索新帧
初始设置环境时,显式添加true
和false
:
(defn setup-environment []
(let [initial-env
(extend-environment primitive-procedure-names
primitive-procedure-objects
the-empty-environment)]
(define-variable! 'true true initial-env)
(define-variable! 'false false initial-env)
initial-env))
但是当输入if表达式时,代码会失败,因为它找不到“true”。(如果只计算true
,在方案版本中计算为#t
,也会发生同样的情况)
;;;评估输入:
(如果为true,则为hello字符串“hi”)
CompilerException java.lang.Throwable:未知表达式类型“true”--
评估,编译:(/home/erooijak/clojure/scheme解释器/scheme-
evaluator.clj:314:1)
(我希望这个被评估为“你好”)
由于eval if
在方案版本中正常工作(如果true
和false
未添加到setup environment
,则不工作),因此eval
似乎不会将true
解释为需要在Clojure版本的环境中查找的内容
不幸的是,我不清楚这种查找在Scheme版本中是如何发生的,也不清楚为什么在Clojure版本中不会发生
我希望有人能给我指明正确的方向,说明为什么计算true
在方案中有效,但在元循环计算器的Clojure实现中无效。我猜想您使用的是Clojure的内置读卡器,而不是基于字符串输入自己实现。true
和false
不适用ad作为符号,而不是布尔值,然后您的变量?
函数可能不会为布尔值返回true
相关地,您编写(define variable!'true initial env)
,就好像您相信'true
和true
是不同的值一样;它们是相同的,就像'6
和6
是相同的。这对我有帮助。最简单的解决方法是进行正确和错误的自我评估。