2011-01-01 17 views
2

Ich versuche ein Schema func zu schreiben, das sich ähnlich wie eine Schleife verhält.scheme basic loop

(loop min max func)

Diese Schleife sollte die FUNC Bereich zwischen min und max (ganzen Zahlen) ausführen

- ein von einem Beispiel wie diese

(loop 3 6 (lambda (x) (display (* x x)) (newline))) 

9 
16 
25 
36 

und I Definieren Sie die Funktion als

(define (loop min max fn) 
    (cond 
     ((>= max min) ((fn min) (loop (+ min 1) max fn) )) 
    ) 
) 

wenn ich den Code ausführen bekomme ich das Ergebnis dann einen Fehler auftreten. Ich konnte diesen Fehler nicht verarbeiten.

(loop 3 6 (lambda (x) (display(* x x))(newline))) 

9 
16 
25 
36 

Backtrace: 
In standard input: 
    41: 0* [loop 3 6 #<procedure #f (x)>] 

In utku1.scheme: 
    9: 1 (cond ((>= max min) ((fn min) (loop # max fn)))) 
    10: 2 [#<unspecified> ... 
    10: 3* [loop 4 6 #<procedure #f (x)>] 
    9: 4 (cond ((>= max min) ((fn min) (loop # max fn)))) 
    10: 5 [#<unspecified> ... 
    10: 6* [loop 5 6 #<procedure #f (x)>] 
    9: 7 (cond ((>= max min) ((fn min) (loop # max fn)))) 
    10: 8 [#<unspecified> ... 
    10: 9* [loop 6 6 #<procedure #f (x)>] 
    9: 10  (cond ((>= max min) ((fn min) (loop # max fn)))) 
    10: 11  [#<unspecified> #<unspecified>] 

**utku1.scheme:10:31: In expression `((fn min) (loop # max ...))`: 
    utku1.scheme:10:31:Wrong type to apply: `#<unspecified>` 
ABORT: (misc-error)** 

Antwort

5

Jede Klausel eines cond Ausdruck hat die Form (cond expr1 expr2 ...), aber Sie haben sowohl Ausdruck1 als auch Ausdruck2 in Parens eingeschlossen, wenn sie getrennt sein sollten. Die Lösung wäre, entweder begin am Anfang anzugeben: ((>= max min) (begin expr1 expr2)) oder begin implizit zu machen: ((>= max min) expr1 expr2).

Alternativ könnte es mehr Sinn machen, eine when Anweisung anstelle einer cond zu verwenden, da Sie nur eine Wahl:

(define (loop min max fn) 
    (when (>= max min) 
    (fn min) 
    (loop (+ min 1) max fn))) 

Da sowohl cond und when Makros sind die if verwenden, werden beide Versionen

(define (loop min max fn) 
    (if (>= max min) 
    (begin (fn min) (loop (+ min 1) max fn)) 
    (void))) 

sowieso.

+0

danke: D Ich habe den Punkt – tkcn

2
((fn min) (loop (+ min 1) max fn)) 

Das ist das Problem. Was Sie dies tun möchten, ist danach (fn min) und dann (loop (+ min 1) max fn) auszuführen. Was es tatsächlich tut ist, es führt (fn min), dann (loop (+ min 1) max fn) und dann versucht es, das Ergebnis (fn min) auf das Ergebnis (loop (+ min 1) max fn) anzuwenden. Da das Ergebnis (fn min) keine Funktion ist, ist dies ein Fehler.

Um zu bekommen, was Sie wollen, tun Sie (begin (fn min) (loop (+ min 1) max fn)). begin können Sie mehrere Ausdrücke nacheinander ausführen.

+0

danke: D ein "Anfang" löste das Problem – tkcn