在 Scheme 中编写一个 While 循环

Writing a While Loop in Scheme

我正在尝试使用递归和 lambda 来实现 while 循环,但我只是不知道该怎么做。

我应该从这个 lambda 表达式开始:

((lambda (x) (x x)) (lambda (x) (x x))

我的第一个问题是为什么这会导致 'eternal' 递归?我试图理解它是如何工作的,但我就是无法理解它。

我也有这个代码要遵循:

((lambda (x) (x x))
 (lambda (x) 
   (if (not (= i 0))
       (begin
         (display i)
         (set! i (- i 1))
         (x x))
       )))

此代码导致循环打印从 i = n 到 i = 0,但我也不明白这一点。如果有人愿意在这里解释 lambda 的用法,我将不胜感激:)

编辑:我必须使用这个 lambda 表达式作为我的 'starting point',我不想使用宏(这是我试图理解的自愿练习,所以我想遵循指导方针: ))

要查看计算 ((lambda (x) (x x)) (lambda (x) (x x)) 时会发生什么,请使用 DrRacket 中的步进器。它可以向您展示评估所采取的步骤。

在 DrRacket 的定义 window 中写下你的表达式。 然后选择教学语言"Intermediate Student with lambda"。然后单击步进器按钮(绿色三角形后跟一个条)。

您会看到类似于图片的内容(使用不同的程序):

更新:

试试这个程序:

(define i 5)

((lambda (x) (x x))
 (lambda (x) 
   (if (not (= i 0))
       (x x)
       'ignore)))

更新:

(define i 5)

(define f
  (lambda (x) 
    (if (not (= i 0))
        (begin
          (display i)
          (set! i (- i 1))
          (x x))
        'done)))

(f f)

或者根本没有任何定义:

((lambda (f) (f f))
 (lambda (x) 
   (if (not (= i 0))
       (begin
         (display i)
         (set! i (- i 1))
         (x x))
       'done)))

这里没有外部变量:

((lambda (f i) (f f i))
 (lambda (x i) 
   (if (not (= i 0))
       (begin
         (display i)
         (x x (- i 1)))
       'done))
 5)

使用 while 函数:

(define (while body . args)
  (apply body body args))

(while (lambda (loop i)
         (if (not (= i 0))
             (begin
               (display i)
               (loop loop (- i 1)))
             'done))
  5)