2009-06-12 12 views
8

¿Cómo puedo aplicar bucle en el PLT-esquema como en java-Loop en PLT Scheme

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

Gracias musicfreak, estoy aprendiendo él. Es por eso que hice esta pregunta :) El documento del esquema no está claro para mí. Pero creo que estaré acostumbrado a eso pronto. – fireball003

+0

Bien, solo asegurándome de que esta no sea una de esas cosas de "haz las tareas para mí". :) No lo sé Esquema, pero buena suerte! –

+2

Si fuera un problema de tarea, entonces vería "problema" en lugar de "problema de sintaxis". – fireball003

Respuesta

14

Su ejemplo en Java no se correlaciona directamente en lenguaje Scheme con sólo aprender algunas palabras clave nuevas ya que aren construcciones explícitas para implementar un bucle for en Scheme (¡a menos que usted mismo escriba una construcción!). La forma de libro de cocina para hacer esto en Scheme es definir una función recursiva que recorre una lista. Aquí está un ejemplo de cómo hacer una función de estilo de bucle en el Esquema:

(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 

Tomado de esta página:

Guile and Scheme Links

Aquí hay otro enlace a una página que describe las ideas que necesita para entiende que traducir los bucles de los lenguajes imperativos con el Esquema:

Scheme Looping Constructs

es un esquema Lenguaje realmente interesante para aprender, también debe leer el Structure and Interpretation of Computer Programs, que es el libro de texto utilizado anteriormente para enseñar Scheme en MIT.

+0

Gracias hombre. Esto es de gran ayuda :) – fireball003

+0

No hay problema, me hace pensar con cariño sobre mis experiencias positivas con Scheme en la universidad. Aprender un lenguaje funcional como Scheme puede convertirlo en un mejor programador, algo que le ayuda a pensar en soluciones elegantes para los problemas. Una vez que sienta que Scheme está empezando a tener sentido, le recomiendo consultar otro lenguaje "diferente", como Prolog. Eso es diferente tanto de Scheme como de Java, y puede enseñarte diferentes cosas nuevas. Buena suerte. :) –

8

El constructo de iteración en Scheme es "do", puede buscarlo en el R5RS specification.

El ejemplo que diste sería algo como esto:

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

(do ...) es un poco más general que lo que se muestra en este ejemplo. Por ejemplo, puede hacer que devuelva un valor en lugar de solo usarlo para sus efectos secundarios. También es posible tener muchos "contadores":

(do ((i 0 (+ i 1) 
    (j 0 (+ j 2)) 
    ((stop? i j) <return-value>) 
    exprs...) 
+1

para ser claros, el segundo ejemplo con dos variables de bucle será complicado si no señala que todas las variables se repiten al mismo tiempo: un "do" = un bucle. este ejemplo se correspondería estrechamente con el ciclo C "for (i = 0, j = 0;!detener (i, j); i = i + 1, j = j + 2) {exprs();} return return_value; ". Bueno, básicamente eso es correcto. Mayormente. – Aaron

+0

Sí, eso es cierto. Editaré la publicación más tarde e intentaré aclarar las cosas un poco. – Jonas

13

En PLT se puede hacer esto:

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