gpt4 book ai didi

scheme - 在方案中使用嵌套的 let 或 let*

转载 作者:行者123 更新时间:2023-12-03 20:53:43 28 4
gpt4 key购买 nike

我正在编写一个以间隔作为参数并返回百分比错误的函数,但我坚持使用 let 或 let*。这是代码:

嵌套的 let 版本:

(define (percent interval)
(let (start-point (car interval))
(let (end-point (cdr interval))
(let (center (/ (+ start-point end-point) 2)))))
(/ (- end-point center) center))

错误是:让:语法错误(不是绑定(bind)的标识符和表达式)在:起点

让*版本:
(define (percent interval)
(let* ((start-point (car interval))
(end-point (cdr interval))
(center (/ (+ start-point end-point) 2))))
(/ (- end-point center) center))

现在的错误是:
let*: bad syntax (missing body) in: (let* ((start-point (car interval)) (end-point (cdr interval)) (center (/ (+ start-point end-point) 2))))

我引用了一些文档,但也无法找出错误。
(ps:我使用的是 DrRacket 6.2)

最佳答案

最后的表达式,除法本身,需要进入 let* .这是因为 let表单引入了仅在词法范围内对其主体的绑定(bind)。此外,let表单需要一个主体,这就是您收到该错误的原因(在您的示例中,它们根本没有主体,因为最终表达式在它们之外)。

要解决此问题,只需在 let* 中移动最终表达式形式:

(define (percent interval)
(let* ((start-point (car interval))
(end-point (cdr interval))
(center (/ (+ start-point end-point) 2)))
(/ (- end-point center) center)))

您的版本使用嵌套 let在另一种方面略有错误:您缺少每个绑定(bind)对的括号级别,这导致了第一个错误。也就是说,而不是这样:
(let (start-point (car interval))
...)

...你需要这个:
(let ((start-point (car interval)))
...)

注意额外的括号。也就是说, let*版本好多了!它只是嵌套 let 的宏自动进行嵌套的表单,因此您不必这样做。

还有一件事:如果您正在编写可移植的 Scheme,则所有括号都必须是括号。但是,如果您正在编写 Racket,则可以将方括号与圆括号互换使用。正因为如此,惯用的 Racket 在某些地方使用方括号作为一种风格选择,以使代码更具可读性。

这些案例之一是 let绑定(bind)对。因此,惯用的 Racket 代码如下所示:
(define (percent interval)
(let* ([start-point (car interval)]
[end-point (cdr interval)]
[center (/ (+ start-point end-point) 2)])
(/ (- end-point center) center)))

这只是有助于更清楚地表明每一对都在创建绑定(bind)而不是调用函数。

关于scheme - 在方案中使用嵌套的 let 或 let*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32174147/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com