我将在示例中描述我的问题。
我会得到(play '(left nothing right left))
。列表中的一些名称是真实的程序,其他我想跳过。
(define (left)
'left
)
我需要在列表中解释名称的过程。解决方案是什么?
当我尝试( (car '(left nothing right left)))
时,我收到错误:程序申请:预期程序,给定:左(无参数)
答案 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))
left
和right
将扩展为您定义的任何内容(例如过程),而nothing
未被引用,因此它将保留为符号。然后play
必须测试每个成员以查看它是否是一个过程,如:
(define (play xs)(for-each (lambda (x)(if (procedure? x)(x) x)) xs))