質問
私は今SICPを学んでいて、ex2.23を実行します。
(define (for-each proc items)
(if (null? items)
#t
((proc (car items))
(for-each proc (cdr items)))))
しかし、実行するとき、エラーを引き起こします: 手順アプリケーション:予想される手順、指定:#;議論は:()
私はその理由を知っていると思います:私はfor-for-functionを再帰的に呼びます、すべてが価値を返したいと思っていました
しかし、コードを変更したとき:
(define (for-each proc items)
(cond ((null? items) #t)
(else (proc (car items)) (for-each proc (cdr items)))))
うまく動作します。わかりません、なぜ?の cond, 、すべてが価値を返す必要はありませんか?
私はdrschemeを使用し、言語を選択します SICP
私は英語のネイティブスピーカーではないので、明確に説明されていないSTHがある場合、plsは私に教えてくれます
解決
ただし、実行するとき、原因エラー:手順アプリケーション:期待>手順、指定:#;議論は:()
私はその理由を知っていると思います:私はfor-for-functionを再帰的に呼びます、>すべてのものが価値を返したいと思っていました
いいえ、それは if
組み合わせがあります ((proc (car items)) (for-each proc (cdr items)))
. 。 2つの組み合わせを評価するつもりでした (proc (car items))
と (for-each proc (cdr items))
順番に、そしてそのために、あなたはそれらを別のペアのペアに置くことが機能すると思った。しかし、実際には、あなたが指定したのは (proc (car items))
の引数に適用される手順であり、 (for-each proc (cdr items))
. 。これは事実ではなく、エラーが発生します。重要なポイントは、LISPの括弧はグループ化のためではなく、明確な意味を持つということです。
問題はそれです if
その位置には単一の組み合わせしか持たないのに対し、2つの連続して2つの組み合わせが必要です。一方で、 cond
そのような制限はありません。あなたは、結果として生じる部分に個々の組み合わせの長いシーケンスを置くことができます cond
あなたの心が望むように条項。この状況は、単に言語が機能するように定義される方法です。
使用することもできます cond
これらの状況では、あなたがまだ使用したい場合 if
複数の組み合わせを1つに詰めるためのオプションがいくつかあります。 E. g。身体が2つの組み合わせであるLambda手順を作成し、すぐに発射できます。
(define (for-each proc items) (if (null? items) #t ((lambda () (proc (car items)) (for-each proc (cdr items)) )) ))
または使用することができます begin
これは実際にそのような目的のために使用されることを意図しています:
(define (for-each proc items) (if (null? items) #t (begin (proc (car items)) (for-each proc (cdr items)) ) ))