Scheme中的简单解释器

时间:2012-02-22 14:49:02

标签: scheme interpreter

我将在示例中描述我的问题。

我会得到(play '(left nothing right left))。列表中的一些名称是真实的程序,其他我想跳过。

(define (left)
   'left
)

我需要在列表中解释名称的过程。解决方案是什么?

当我尝试( (car '(left nothing right left)))时,我收到错误:程序申请:预期程序,给定:左(无参数)

2 个答案:

答案 0 :(得分:4)

(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)))

答案 1 :(得分:0)

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

(play `(,left nothing nothing ,right nothing))

leftright将扩展为您定义的任何内容(例如过程),而nothing未被引用,因此它将保留为符号。然后play必须测试每个成员以查看它是否是一个过程,如:

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