2011-01-01 13 views
2

私はループに似たような振る舞いをするスキームfuncを書こうとしています。体系基本ループ

(最大FUNC分ループ)

このループは範囲minとmax(整数)との間のFUNCを実行する必要が

- この

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

9 
16 
25 
36 

及びIのような例の一つ関数を定義します。

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

コードを実行すると結果がエラーになります。 発生する。 このエラーを処理できませんでした。

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

答えて

5

cond式の各節は、(cond expr1 expr2 ...)という形式ですが、expr1とexpr2の両方を区切る必要がある場合は、括弧で囲みました。解決方法は、最初にbeginを指定するか、((>= max min) (begin expr1 expr2))を指定するか、beginを暗黙的に​​にします。

また、それはあなたが唯一の選択肢があるので、condの代わりにwhenステートメントを使用する方が理にかなってあります:condwhen両方がifを使用するマクロなので

​​

を、両方のバージョンが

になりますとにかく
(define (loop min max fn) 
    (if (>= max min) 
    (begin (fn min) (loop (+ min 1) max fn)) 
    (void))) 

とにかく。

+0

ありがとう:D私はポイントを得た – tkcn

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

これが問題です。これを実行するには、(fn min)を実行してから(loop (+ min 1) max fn)を実行します。実際には、(fn min)、次に(loop (+ min 1) max fn)を実行し、(loop (+ min 1) max fn)の結果に(fn min)の結果を適用しようとします。 (fn min)の結果は関数ではないため、これはエラーです。

希望するものを得るには、(begin (fn min) (loop (+ min 1) max fn))を実行してください。 beginを使用すると、複数の式を連続して実行できます。

+0

ありがとう:D "開始"問題を解決しました – tkcn