在 chez 方案中发布未绑定变量

Issue unbound variable in chez scheme

我正在定义一个函数 replaceOccurrence 来替换两个符号中任何一个的第一次出现。我不明白为什么列表变量没有绑定 Chez 计划版本 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 does,并在文档中明确说明。 Guile 似乎也支持 λ,但我没有看到记录。由于 λ 在 Chez Scheme 中未被识别为特殊形式,因此首先评估 λ 的参数,并且由于它们尚未绑定,因此发出报告的错误。

OP代码还有一个问题:lista单独在括号里两次;这每次都尝试将 lista 作为过程调用。此外,occurrence 拼写为两个 C;并且在 Scheme 中更喜欢 kebab-case 而不是 camelCase。这是固定代码:

(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