6

次のコードの場合:

(foldl and #t '(#t #f))

ラケットの返品:

and: bad syntax in: and

andは関数ではないことを知っています。そして、次を使用してこの問題を回避できますlambda

(foldl (lambda (a b) (and a b)) #t '(#t #f))

ここで 2 つの質問があります。

  1. and関数ではありません。では、それは何ですか?マクロですか?

  2. 使用する私のソリューションlambdaは醜いようです。この問題を解決するより良い方法はありますか?

ありがとうございました。

4

1 に答える 1

8

これは条件付き 構文形式であるか、コンパイラ/インタープリターによって特殊なケースとして扱われるコア構文形式に展開されるマクロとして実装される場合があります。

ラケットのドキュメントにあるリストには特別な形式として含まifれていますが、含まれていないandため、後者はおそらく前者の観点から実装されています。しかし、R5RS はand構文キーワードとしてリストされています。したがって、これは特別な構文またはマクロのいずれかであると言えます。

and任意のフォームをフォーム(and a b c ...)として書き直すのは簡単です。if(if a (if b (if c #t #f) #f) #f)

lambdaevery私には問題ありませんが、 SRFI-1 (またはRacket のandmap)からも使用できます。

(every identity '(#t #f))

返すべき#fです。

編集: Joshua Taylor が指摘するlambdaように、関数 like を介してあなたを呼び出すことfoldlは短絡しません。andこれは、そもそもを呼び出す目的を無効にします。

もう 1 つのことは、Racket のfoldl最後引数lambdaは、一連のアプリケーションの前の結果を受け取る引数です。したがって、実装は本当に

(foldl (lambda (a b) (and b a)) #t '(#t #f))
于 2013-07-29T08:47:51.247 に答える