3

これを行うと、どのような「種類」が得られますか?

(car (list lambda lambda))

私は戻ってくると思っlambdaた、それは私ができることを意味します

(define my_lambda (car (list lambda lambda)))
(define foo (my_lambda (n) (+ n n)))

しかし、それはうまくいきませんでした!ありがとう、

4

2 に答える 2

5

lambdaは特別な形式 (つまり、標準の評価規則は適用されません) であり、言語のコア プリミティブの一部であり、変数に割り当てることができるシンボルやその他の種類の値ではありません。

あなたの質問に答えると、式(list lambda)を評価した後に得られる「種類」は、使用しているSchemeインタープリターによって異なりますが、多くの場合、エラーが発生します。たとえば、DrRacket は次のように文句を言います。

lambda: bad syntax in: lambda
于 2012-10-18T22:28:46.477 に答える
2

ある意味で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 コードを記述してマクロを定義することもできますが、これにはもう少し複雑な作業が伴います。

于 2012-10-19T01:14:20.803 に答える