scheme - 在 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
解决方案
Chez Scheme 不支持λ
作为lambda
. Racket 确实如此,并在文档中明确说明。Guile 似乎也支持λ
,但我没有看到记录。由于λ
在 Chez Scheme 中不被识别为特殊形式,因此λ
首先评估参数,并且由于它们尚未绑定,因此会发出报告错误。
OP代码还有一个问题:lista
括号里是单独两次;这尝试lista
每次都作为过程调用。此外,发生用两个 C 拼写;并且更喜欢kebab-case
在camelCase
Scheme中。这是固定代码:
(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
.
推荐阅读
- asset-pipeline - Rails 5.1 将 js 文件从 app/assets/javascripts 移动到 app/javascripts
- sql - oracle 子查询与 order by 不工作
- angular - 遍历firebase列表中的列表
- ios - 如何更改 AVRoutePickerView 的元数据?
- cygwin - 在 Cygwin 中安装 dc
- c# - 反序列化嵌套的 JSON 字符串,无法访问属性
- swift - 是否可以在与 swift 中的多个键关联的字典中拥有相同的集合实例?
- c++ - 使用 sfinae 进行模板模板参数推导
- angular - 带有可排序标题的 Angular 5 材料表
- hyperledger-fabric - Hyper Fabric [fabric-sdk-go] 错误:CONNECTION_FAILED。说明:拨号连接超时