8

我怎样才能像在java中一样在plt-scheme中实现循环-

for(int i=0;i<10;){
     for(int j=0;j<3;){
          System.out.println(""+j);
          j++;
     }
      System.out.println(""+i);
      i++;
}
4

4 回答 4

14

您在 Java 中的示例不会通过学习一些新关键字直接映射到 Scheme 语言,因为在 Scheme 中没有用于实现 for 循环的显式构造(除非您自己编写构造!)。在 Scheme 中执行此操作的食谱方法是定义一个循环遍历列表的递归函数。以下是如何在 Scheme 中执行 for 循环样式函数的示例:

(define (doit x x-max dx)
  (if (<= x x-max)
    (begin
      ;;...perform loop body with x...
      (doit (+ x dx) x-max dx))))

(doit a b dx) ; execute loop from a to b in steps of dx

取自此页面:

Guile 和 Scheme 链接

这是另一个指向页面的链接,该页面描述了将循环从命令式语言转换为 Scheme 需要理解的想法:

方案循环结构

Scheme 是一门非常有趣的语言,您还应该阅读计算机程序的结构和解释,这是以前在 MIT 用于教授 Scheme 的教科书。

于 2009-06-12T05:56:45.183 回答
13

在 PLT 中,您可以这样做:

(for ([i (in-range 10)])
  (for ([j (in-range 3)]) (printf "~s\n" j))
  (printf "~s\n" i))
于 2009-06-26T10:44:38.070 回答
8

Scheme中的迭代构造是“ do”,你可以在R5RS规范中查到。

您提供的示例如下所示:

(do ((i 0 (+ i 1))) ((> i 9))
  (do ((j 0 (+ j 1))) ((> j 2))
    (display j)
    (newline))
  (display i)
  (newline))

(do ...)比这个例子中显示的更一般。例如,您可以使其返回一个值,而不仅仅是将其用于其副作用。也可以有许多“计数器”:

(do ((i 0 (+ i 1) 
     (j 0 (+ j 2)) 
    ((stop? i j) <return-value>)
   exprs...)
于 2009-06-12T07:03:57.923 回答
1

我建议你看看 Michele Simionato 的“Schemeland 中的 Pythonista 历险记”。它适用于 python->scheme,但是,它写得非常好,更重要的是,它来自procedural->functional。

于 2009-06-12T06:13:22.023 回答