Scheme中'when'的用法是什么?

5 scheme

我正在尝试在 Scheme 中使用时,但我不知道为什么我的列表的最后一个元素出现 .#void>。

这是我的代码

(define (genlist x y)
   (when
       (< x y)
       (cons x (genlist (+ x 1) y))))
Run Code Online (Sandbox Code Playgroud)

这是我的输出 =>

(2 3 4 5 6 7 8 9 . #void>)
Run Code Online (Sandbox Code Playgroud)

Ósc*_*pez 3

当我们when需要编写一个if没有else部分的表达式时,和/或当我们需要在if. 仅返回最后一个表达式的值,因此我们主要将其用于副作用。为了更好地理解它,在 Racket 中:

(when <condition>
  <exp1>
  <exp2>
  <exp3>)
Run Code Online (Sandbox Code Playgroud)

相当于这样:

(if <condition>
    (begin
      <exp1>
      <exp2>
      <exp3>)
    (void)) ; implementation-dependent
Run Code Online (Sandbox Code Playgroud)

同样的注意事项也适用于unless,只不过条件被 包围起来(not ...)

你的问题的根源(以及为什么有一个if没有 an 的代码味道的原因else)是你的代码没有处理当 时的情况(>= x y)。问问自己,在这种情况下你应该做什么?很简单,返回一个空列表!这是代码中缺少的递归的基本情况。