我正在编写一个以间隔为参数的函数并返回百分比错误,但我坚持使用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))
错误是:let:错误的语法(不是绑定的标识符和表达式):start-point
让*版本:
(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)
答案 0 :(得分:6)
最后一个表达式,即除法本身,需要 in let*
。这是因为let
形式引入了仅在词法上限定为其主体的绑定。此外,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
的版本以另一种方式略有错误:您为每个绑定对丢失了一定数量的parens,这导致了第一个错误。也就是说,而不是:
(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)))
这有助于更清楚地说明每一对都在创建绑定而不是调用函数。