我正在定义一个函数replaceOccurrence,它将替换两个符号中第一个出现的符号。我不明白为什么列表变量没有绑定Chez Scheme 9.5版
(define replaceOcurrence
(λ (new ocurrence1 ocurrence2 lista)
(cond
((null? lista) '())
(else (cond
((eq? ocurrence1 (car lista))
(cons new (cdr (lista))))
((eq? ocurrence2 (car lista))
(cons new (cdr (lista))))
(else (cons (car lista)
(replaceOcurrence new ocurrence1 ocurrence2 (cdr lista)))))))))
Exception: variable lista is not bound
Chez Scheme不支持λ
作为lambda
的替代品。Racket做到了,并且在文档中明确表示。Guile似乎也支持λ
,但我没有看到这方面的记录。由于λ
在Chez Scheme中未被识别为特殊形式,因此首先评估λ
的自变量,并且由于它们尚未绑定,因此会发出报告的错误。
OP代码中还有另一个问题:lista
单独在括号中两次;这尝试每次调用CCD_ 7作为过程。此外,出现用两个Cs拼写;并且在方案中优选CCD_ 8而不是CCD_。这是固定代码:
(define replace-occurrence
(lambda (new occurrence1 occurrence2 lista)
(cond
((null? lista) '())
(else
(cond
((eq? occurrence1 (car lista))
(cons new (cdr lista)))
((eq? occurrence2 (car lista))
(cons new (cdr lista)))
(else
(cons (car lista)
(replace-occurrence new occurrence1 occurrence2 (cdr lista)))))))))
解决OP问题的最好、最便携的方法是简单地使用lambda
。但是,如果真的想要使用λ
,可以使用宏来提供必要的语法:
(define-syntax λ
(syntax-rules ()
[(_ formals . body)
(lambda formals . body)]))
由于包含了上述宏(以及答案第一部分中提到的其他必要更改(,OP代码可以使用λ
代替lambda
。