これを行うと、どのような「種類」が得られますか?
(car (list lambda lambda))
私は戻ってくると思っlambda
た、それは私ができることを意味します
(define my_lambda (car (list lambda lambda)))
(define foo (my_lambda (n) (+ n n)))
しかし、それはうまくいきませんでした!ありがとう、
lambda
は特別な形式 (つまり、標準の評価規則は適用されません) であり、言語のコア プリミティブの一部であり、変数に割り当てることができるシンボルやその他の種類の値ではありません。
あなたの質問に答えると、式(list lambda)
を評価した後に得られる「種類」は、使用しているSchemeインタープリターによって異なりますが、多くの場合、エラーが発生します。たとえば、DrRacket は次のように文句を言います。
lambda: bad syntax in: lambda
ある意味でlambda
は、実行時には存在しません (確かに、ラムダ ステートメントによって作成された関数lambda
は存在しますが、それは別の問題です。それらはそれ自体ではありません)。
この理由は、ラムダ ステートメントが実行時に存在しない他のものを操作するためです。特に、変数名の意味が変わります(あなたの例では、n
)。
どのようなものかという質問に答えるにlambda
は、通常、「構文」と答えます。幸いなことに、Scheme は構文を抽象化するメカニズムであるマクロを提供します。マクロは、変数名やラムダ、その他のマクロなど、コンパイル時のみのエンティティを抽象化できます。したがって、次のように書くことができます (この場合、Racket REPL で):
> (define-syntax-rule (mylambda (x ...) body)
(lambda (x ...) body))
> (define foo (mylambda (n) (+ n n)))
> (foo 71)
142
Scheme マクロを定義するシステムは複数あります。syntax-rules
システムはs を珍しい方法で使用します...
が、最終的には非常に直感的な方法です。また、Scheme を発行する Scheme コードを記述してマクロを定義することもできますが、これにはもう少し複雑な作業が伴います。