2

Dr.Racket を使用して、Scheme で次のコードを実行しようとしています。

(foldr or #f '(#f #f #f #t))

今、私はこれがうまくいくと思っていました。

(foldr + 0 '(1 2 3))

うまくいき、6を返しました。

しかし、論理的な or で実行しようとすると、「or: bad syntax in: or」が表示されます

私は何を間違っていますか?また、フォールドを使用せずにリストの or を計算する別の方法はありますか?

4

2 に答える 2

5

折りたたみの特定のケースではor、 を使用する必要がありますormap。で使用する関数としてidentity(または)を渡すことができます。valuesormap

> (ormap identity '(#f #f #f #f #t))
#t
> (ormap identity '(#f #f #f #f #f))
#f

一般に、マクロではなく関数のみを折りたたむことができます。また、orショートサーキット動作があるためマクロです。

于 2013-09-16T21:54:55.110 に答える
1

私のスキームはかなり弱いですが、私が間違っていない場合、または関数ではなくマクロであるため、高次の呼び出しでそれを渡すことはできません。ただし、ラムダでラップすることはできますが、見栄えが悪くなります。

(foldr (lambda (a b) (or a b)) #f '(#f #f #f #t)) => #t

引数の数が事前にわかっている場合は、 or が 0 個以上の引数を取ることに注意してください。

(or) => #f
(or #f) => #f
(or #t) => #t
(or #t #f) => #t
(or #f #f #f #f #f) => #f

それ以外の場合は、回答を提供するために私よりも経験豊富なSchemerが必要になります.

于 2013-09-16T21:55:19.830 に答える