【问题标题】:Issue unbound variable in chez scheme在 chez 方案中发出未绑定的变量
【发布时间】:2020-08-22 18:38:49
【问题描述】:

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

【问题讨论】:

    标签: scheme chez-scheme


    【解决方案1】:

    Chez Scheme 不支持将λ 替换为lambdaRacket 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 2013-11-06
      • 2012-10-04
      • 2012-01-04
      • 1970-01-01
      • 2012-08-30
      • 2020-07-04
      相关资源
      最近更新 更多