3

map値のリストをテストして、特定のプロパティがあるかどうかを確認するために使用しています。次に、それらすべてがそのプロパティを持っているかどうかを確認し、すべて持っている場合は返しtrue ます

したがって、私の最初のアイデアはand、リストをとして与えることでした(and (list #t #t #f))が、それは全体(#t #t #f)をブール値trueとして扱い、それを返すようです。

だから、私は使用できると思いましfoldlた。私はそれがうまく(foldl + 0 (list 1 2 3))いくはずだと思った作品を知って(foldl and #t (list #t #t #f))います...しかしそれはそうではありません。

DrRacket(を使用#lang racket)ではエラー " "が発生and: bad syntax in: andしますが、これはあまり役に立ちませんが、Repl.it(BiWaSchemeを使用ではエラー" Error: #<Syntax and> is not a function"が発生します。

だから、それandはマクロだと思いますか?これをサポートするのは、+私が取得したと評価した場合のようです#<procedure:+>が、and取得した場合and: bad syntax in: and(厳密にxorは、手順ですがor、、ではnorありnandません)。

それで、それはマクロか何か(おそらく短絡を容易にするため)ですか?もしそうなら、「and」演算を実行するブール関数は何ですか?

4

3 に答える 3

8

他の回答では、関数であるかのように使用する方法が既に説明されていますandが、その理由andは、マクロが他の言語から慣れている「短絡」動作をサポートするためです。たとえば、偽の値を見つけるとすぐに停止する(and #f (display "blah"))ため、何も出力しません。and関数andである場合、その両方の引数は、それを呼び出す前に必ず評価され、その後、display関係なく発生します。

于 2013-01-01T12:50:20.920 に答える
6

はい、andマクロです。しかし、あなたはそれを関数に変えることができます

(lambda (x y) (and x y))

のように

(foldl (lambda (x y) (and x y)) #t your-list)
于 2012-12-30T05:44:19.197 に答える