(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 是这样工作的。
代码本身没有问题。
使用这种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 接受任意数量的表达式并执行它们中的每一个,但只返回正文中最后一个表达式的结果。