2016-08-08 14 views
1

ラケットには、最初のパラメータとしてもう1つの関数を、2番目のパラメータとして別の関数を使うことになっています。ラケットでパラメータを再帰的に渡す

すべては、関数の最初の呼び出しでうまくいくようですが、再帰的に関数をパラメータとして呼び出そうとすると、関数にパラメータが必要になります。私は、このパラメータ関数を再帰時に関数として渡したいが、定義内の他の場所の評価に使用したい。どんな助けでも大歓迎です。

(define apply-to-pairs 
    (lambda (arg1 arg2) 
    (if (or (equal? (length arg2) 0) 
      (equal? (length arg2) 1)) 
     '() 
     (cons (arg1 (car arg2) (car (cdr arg2))) 
       (apply-to-pairs (arg1 (cdr (cdr arg2)))))))) 

これは私のコードであり、それは罰金コンパイルするが、適用・ツー・ペアへの再帰呼び出しが行われたとき、私はちょうどそれはそれはのように入って来関数の定義として渡すことにしたいしながら、プログラムがARG1のパラメータを望んでいます。私はそこにエラーを '期待2のパラメータが見つかりましたが、それは引数として(cdr (cdr arg2))を見ているので、私は再帰呼び出しの2番目のパラメータになることを意味します。

答えて

3

apply-to-pairsへの再帰呼び出しでは、単純に値として渡すのではなく、arg1を呼び出しています。つまり、(arg1 (cdr (cdr arg2)))の周りに余分な括弧があります。

(define apply-to-pairs 
    (lambda (arg1 arg2) 
    (if (or (equal? (length arg2) 0) (equal? (length arg2) 1)) 
     '() 
     (cons (arg1 (car arg2) (car (cdr arg2))) 
       (apply-to-pairs arg1 (cdr (cdr arg2))))))) 

これらのバグを見つけるのが簡単になるように、より多くの行にコードを書式設定することを検討してください。

+0

あなたは命を味わっています。どうもありがとうございます。 Racketのプログラミングには新しく書いてありますが、書式設定はとてもうまくいっています。再度、感謝します。 – Cheme