首页 > 解决方案 > 在 chez 方案中发出未绑定的变量

问题描述

我正在定义一个函数 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

标签: schemechez-scheme

解决方案


Chez Scheme 不支持λ作为lambda. Racket 确实如此,并在文档中明确说明。Guile 似乎也支持λ,但我没有看到记录。由于λ在 Chez Scheme 中不被识别为特殊形式,因此λ首先评估参数,并且由于它们尚未绑定,因此会发出报告错误。

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

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


推荐阅读