“评估”;“真的”;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

我将元循环计算器的版本转换为Clojure。主要的区别(除了语法)是对环境结构的处理。因为您不能使用
设置汽车
设置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
是相同的。

这对我有帮助。最简单的解决方法是进行正确和错误的自我评估。