Scheme 方案中的简单解释器

Scheme 方案中的简单解释器,scheme,interpreter,Scheme,Interpreter,我将举例说明我的问题 我将获得(播放(左无右左))。列表中的一些名称是真实的过程,其他的我想跳过 (define (left) 'left ) 我需要解释清单上有名字的程序。解决办法是什么 当我尝试((car'(left nothing right left))时,我得到了错误:过程应用程序:预期过程,给定:left(无参数)(car'(left nothing right left))的计算结果为符号left,它是过程的名称,但实际上不是过程,因此您无法调用它 您需要构建一个关联列表,

我将举例说明我的问题

我将获得
(播放(左无右左))
。列表中的一些名称是真实的过程,其他的我想跳过

(define (left)
   'left
)
我需要解释清单上有名字的程序。解决办法是什么

当我尝试
((car'(left nothing right left))
时,我得到了错误:过程应用程序:预期过程,给定:left(无参数)

(car'(left nothing right left))
的计算结果为符号
left
,它是过程的名称,但实际上不是过程,因此您无法调用它

您需要构建一个关联列表,将符号映射到过程:

(define actions `((left . ,(lambda () 'left))
                  (right . ,(lambda () 'right))
                  (nothing . ,(lambda () (display "I'm staying put")))))
然后可以为列表中的第一个元素调用适当的函数

((cdr (assoc (car '(left nothing right left)) actions)))
(car'(left nothing right left))
计算为符号
left
,它是过程的名称,但实际上不是过程,因此不能调用它

您需要构建一个关联列表,将符号映射到过程:

(define actions `((left . ,(lambda () 'left))
                  (right . ,(lambda () 'right))
                  (nothing . ,(lambda () (display "I'm staying put")))))
然后可以为列表中的第一个元素调用适当的函数

((cdr (assoc (car '(left nothing right left)) actions)))

您还可以使用quasiquoting来构建一个列表,其中包含您想要评估的符号和其他您不想要评估的符号的混合,例如

(play `(,left nothing nothing ,right nothing))
left
right
将扩展到您定义的任何内容(如过程),而
nothing
未被取消引用,因此将作为符号保留<代码>播放然后必须测试每个成员,看看这是否是一个过程,比如:

(define (play xs)(for-each (lambda (x)(if (procedure? x)(x) x)) xs))

您还可以使用quasiquoting来构建一个列表,其中包含您想要评估的符号和其他您不想要评估的符号的混合,例如

(play `(,left nothing nothing ,right nothing))
left
right
将扩展到您定义的任何内容(如过程),而
nothing
未被取消引用,因此将作为符号保留<代码>播放然后必须测试每个成员,看看这是否是一个过程,比如:

(define (play xs)(for-each (lambda (x)(if (procedure? x)(x) x)) xs))

这是返回我再次符号左,不是程序,但谢谢你。你的建议是使用符号。过程对帮助我找到几乎相同问题的答案,我认为它正做着我想要的事情。@Houp:这是给你一个符号,因为你的函数返回了一个符号。这是再次给我返回符号left,不是过程,而是谢谢你。你的建议是使用符号。过程对帮助我找到几乎相同问题的答案,我认为它正是我想要的。@Houp:这是给你一个符号,因为你的函数返回一个符号。