let in 方案的语法

And*_*eri 1 scheme loops let named chicken-scheme

我无法理解let在我发现的示例中的这种用法。我正在使用鸡肉计划。

(let loop ()
    (print "hello world")
    (loop)
)
Run Code Online (Sandbox Code Playgroud)

这是一个简单的无限循环,它递归地调用自己,我无法理解的是语法。我知道第一个参数必须是一个成对列表,((<var[1]> <value[1]>)...(<var[n]> <value[n]))其他参数是 let 的主体。那么,为什么这个片段有效呢?

Ósc*_*pez 5

这是一个namedlet,它是辅助过程的简写,通常用于使用递归进行循环,参数随着递归的进行而前进(尽管在您的代码中没有使用参数)。例如,这个过程:

(define (test)
  (let loop ((i 5))
    (cond ((<= i 0) 'ok)
          (else (print i)
                (loop (- i 1))))))
Run Code Online (Sandbox Code Playgroud)

...相当于这个:

(define (test)
  (define (loop i)
    (cond ((<= i 0) 'ok)
          (else (print i)
                (loop (- i 1)))))
  (loop 5))
Run Code Online (Sandbox Code Playgroud)

现在您看到问题中的代码片段与编写此代码相同:

(define (loop)
  (print "hello world")
  (loop))

(loop)
Run Code Online (Sandbox Code Playgroud)

另请注意,名称“循环”只是一个约定,您也可以将其命名为“iter”或“helper”或您喜欢的任何其他名称,这并不重要。