scheme 中嵌套 let 或 let* 的使用
Usage of nested let or let* in scheme
我正在编写一个将间隔作为参数和 returns 百分比错误的函数,但我坚持使用 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))
错误是:让:语法错误(不是绑定的标识符和表达式)在:起点
让*版本:
(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
形式引入了仅在词法范围内作用于其主体的绑定。此外,let
形成 require 一个正文,这就是为什么您会收到该错误的原因(在您的示例中,它们根本没有正文,因为最终表达式在它们之外) .
要解决此问题,只需将最终表达式移动到 let*
形式中:
(define (percent interval)
(let* ((start-point (car interval))
(end-point (cdr interval))
(center (/ (+ start-point end-point) 2)))
(/ (- end-point center) center)))
您使用嵌套 let
的版本在另一个方面略有错误:您缺少每个绑定对的括号级别,这导致了第一个错误。也就是说,而不是这个:
(let (start-point (car interval))
...)
...你需要这个:
(let ((start-point (car interval)))
...)
注意额外的括号。也就是说,let*
版本要好得多!它只是一个用于嵌套 let
表单的宏,它会自动进行嵌套,因此您不必这样做。
还有一件事:如果你正在编写可移植的 Scheme,所有的括号都需要是括号。但是,如果您正在编写 Racket,则可以使用方括号 可互换 和圆括号。因此,惯用的 Racket 在某些地方使用方括号作为一种风格选择,使代码更具可读性。
其中一个案例是 let
绑定对。因此,惯用的 Racket 代码看起来像这样:
(define (percent interval)
(let* ([start-point (car interval)]
[end-point (cdr interval)]
[center (/ (+ start-point end-point) 2)])
(/ (- end-point center) center)))
这有助于更清楚地说明每对都在创建 绑定 而不是调用函数。
我正在编写一个将间隔作为参数和 returns 百分比错误的函数,但我坚持使用 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))
错误是:让:语法错误(不是绑定的标识符和表达式)在:起点
让*版本:
(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
形式引入了仅在词法范围内作用于其主体的绑定。此外,let
形成 require 一个正文,这就是为什么您会收到该错误的原因(在您的示例中,它们根本没有正文,因为最终表达式在它们之外) .
要解决此问题,只需将最终表达式移动到 let*
形式中:
(define (percent interval)
(let* ((start-point (car interval))
(end-point (cdr interval))
(center (/ (+ start-point end-point) 2)))
(/ (- end-point center) center)))
您使用嵌套 let
的版本在另一个方面略有错误:您缺少每个绑定对的括号级别,这导致了第一个错误。也就是说,而不是这个:
(let (start-point (car interval))
...)
...你需要这个:
(let ((start-point (car interval)))
...)
注意额外的括号。也就是说,let*
版本要好得多!它只是一个用于嵌套 let
表单的宏,它会自动进行嵌套,因此您不必这样做。
还有一件事:如果你正在编写可移植的 Scheme,所有的括号都需要是括号。但是,如果您正在编写 Racket,则可以使用方括号 可互换 和圆括号。因此,惯用的 Racket 在某些地方使用方括号作为一种风格选择,使代码更具可读性。
其中一个案例是 let
绑定对。因此,惯用的 Racket 代码看起来像这样:
(define (percent interval)
(let* ([start-point (car interval)]
[end-point (cdr interval)]
[center (/ (+ start-point end-point) 2)])
(/ (- end-point center) center)))
这有助于更清楚地说明每对都在创建 绑定 而不是调用函数。