我正在编写一个函数,以一个间隔作为参数,并返回百分比错误,但我坚持使用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))错误是: let: bad语法(不是绑定的标识符和表达式)在: 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)
发布于 2015-08-24 03:52:17
最后一个表达式,即除法本身,需要进入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))
...)...you需要这样做:
(let ((start-point (car interval)))
...)注意额外的括号。也就是说,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)))这只会有助于更清楚地表明,每对都在创建绑定,而不是调用函数。
https://stackoverflow.com/questions/32174147
复制相似问题