在PLT计划中循环

时间:2009-06-12 05:49:29

标签: syntax loops scheme racket

如何在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 个答案:

答案 0 :(得分:14)

您在Java中的示例并没有通过学习一些新的关键字直接映射到Scheme语言,因为没有用于在Scheme中实现for循环的显式构造(除非您自己编写构造!)。在Scheme中执行此操作的cookbook方法是定义循环遍历列表的递归函数。这是一个如何在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 and Scheme Links

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

Scheme Looping Constructs

Scheme是一门非常有趣的语言,您还应该阅读Structure and Interpretation of Computer Programs,这是以前用于麻省理工学院教学计划的教科书。

答案 1 :(得分:13)

在PLT中你可以这样做:

(for ([i (in-range 10)])
  (for ([j (in-range 3)]) (printf "~s\n" j))
  (printf "~s\n" i))

答案 2 :(得分:8)

Scheme中的迭代构造是“do”,您可以在R5RS specification中查找。

你给出的例子看起来像这样:

(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...)

答案 3 :(得分:1)

我建议你去看Michele Simionato的"The adventures of a pythonista in schemeland"。它适用于python-&gt;方案,但是,真的写得很好,更重要的是,它来自程序 - &gt;功能。