球拍开始形式

har*_*503 3 scheme racket

(define mystery2 
  (lambda (L)
    (if (null? L)
        L
        (begin
          (displayln L)
          (append (mystery2 (cdr L))
                  (list (car L)))))))
Run Code Online (Sandbox Code Playgroud)

我运行它 (mystery2 '((1 2) (3 4) 5 6))

在这里,我不确定“开始”函数的作用。

另外,当我写“displayln L”时,它只给我们((1 2) (3 4) 5 6)). 因为它是递归,所以不应该打印出递减的值吗?

请帮助我理解为什么这里使用“开始”并且 displayln 是这样工作的。

代码本身没有问题。

Chr*_*yer 5

使用这种begin形式是因为if每个分支中只允许 1 个表达式。

一个更直观的例子可能是调试。假设您正在编写复杂的代码,并且想要查看执行了哪个分支。

原始代码:

(if (true? some-value)
    (dostuff)
    (dostuff2))
Run Code Online (Sandbox Code Playgroud)

但是您不确定正在执行哪个分支,因此您可能希望在执行任一分支时打印一条消息。但是由于 Scheme 只允许在每个分支中使用单个表达式,因此您不能将它们放在那里。您必须将它们粘合在一个表达式中,并使用begin.

(if (true? some-value)
    (begin
      (display "some-value was true")
      (dostuff))
    (begin 
      (display "some-value was false")
      (dostuff2)))
Run Code Online (Sandbox Code Playgroud)

Begin 接受任意数量的表达式并执行它们中的每一个,但只返回正文中最后一个表达式的结果。