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

Cae*_*sar 3 scheme racket

我正在写一个以间隔为参数的函数并返回百分比错误,但我坚持使用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))
Run Code Online (Sandbox Code Playgroud)

错误是: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))
Run Code Online (Sandbox Code Playgroud)

现在的错误是:

let*: bad syntax (missing body) in: (let* ((start-point (car interval)) (end-point (cdr interval)) (center (/ (+ start-point end-point) 2))))
Run Code Online (Sandbox Code Playgroud)

我已经提到了一些文档,但也无法弄清楚错误.(ps:我正在使用DrRacket 6.2)

Ale*_*ing 6

最终的表达,这样的分类本身,需要去里面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)))
Run Code Online (Sandbox Code Playgroud)

你使用嵌套的版本let在另一种方式上有点错误:你错过了每个绑定对的一个parens级别,这导致了第一个错误.也就是说,而不是这个:

(let (start-point (car interval))
  ...)
Run Code Online (Sandbox Code Playgroud)

...你需要这个:

(let ((start-point (car interval)))
  ...)
Run Code Online (Sandbox Code Playgroud)

请注意额外的括号.也就是说,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)))
Run Code Online (Sandbox Code Playgroud)

这有助于更清楚地表明每对创建绑定而不是调用函数.