ラムダと一緒に# 'を使用するのはなぜですか?それは通常そのように書かれているので、それは良い形だと思います。しかし、これらの行は私と同じように見えます:ラムダで# 'を使用する理由は?
> (mapcar #'(lambda (x) (+ x 1)) '(1 2 3))
(2 3 4)
> (mapcar (lambda (x) (+ x 1)) '(1 2 3))
(2 3 4)
初心者には違いを教えてください。
ラムダと一緒に# 'を使用するのはなぜですか?それは通常そのように書かれているので、それは良い形だと思います。しかし、これらの行は私と同じように見えます:ラムダで# 'を使用する理由は?
> (mapcar #'(lambda (x) (+ x 1)) '(1 2 3))
(2 3 4)
> (mapcar (lambda (x) (+ x 1)) '(1 2 3))
(2 3 4)
初心者には違いを教えてください。
#'
は、function
の省略形で、(適用する代わりに)関数へのポインタを返します。 lambda
は関数を返します。通常、その関数へのポインタが必要です。これは非常に一般的なので、あなたのためにそれを行うマクロ(変数空間内)もあります。これはlambda
と同様です。両方のコード行は同じです。
どちらが良いのはLisp-1/Lisp-2 debateです:Common Lispでは、マクロのおかげでいずれかを行うことができます。いつものように、一貫してください。
さまざまなLispの方言では異なります。以下はCommon Lispを使用しています。
最初の#は(機能...)の短い表記です。そこで、以下では唯一のテキストで異なりますが、Common Lispは、同じようにそれらを読み取ります
#'(lambda (x) (* x 2))
と
(function (lambda (x) (* x 2)))
#」readmacroで、LispのコードはLispのシステムによって読み取られたときに変換します。
Lispは
(function (lambda (x) (* x 2)))
のLispシステムを評価する場合は、関数オブジェクトを作成し、関数は、その値として返します。
したがって、値として関数が必要なときは、そのように書く必要があります。引数として別の関数に渡す場合、関数から返す場合、または変数に格納する場合は、値としての関数が必要です。例:
(map #'(lambda (x) (* x 2)) '(1 2 3))
(defun (y) #'(lambda (x) (* x y)))
(defparameter *twice-fn* #'(lambda (x) (* x 2)))
ここで、(λ(x)(* x 2))とは何ですか?
文脈によっては2つの異なることがあります。
ラムダ式
は、ラムダ式は関数名の代わりに使用することができます:上記の二つの
(function foo) and (function (lambda (x) (* x 2)))
と
(foo 17) and ((lambda (x) (* x 2)) 17)
法的Common Lispの構文です。ラムダ式を直接使用することができます。次の二つの形態は、Common Lispで違法であること
注:マクロLAMBDAが追加されたCommon Lispの標準化プロセス中
(#'(lambda (x) (* x 2)) 17) ; illegal in Common Lisp
(function #'(lambda (x) (* x 2))) ; illegal in Common Lisp
マクロ
は(それが一部ではなかったですCommon Lispの最初の説明、CLtL1)。わずかに短いコードを書くことができます。例:
(lambda (x) (* x 2))
上記の場合、LAMBDAはマクロです。上記の関数の形で、内側のラムダは、ラムダ式の一部である関数を示し、展開されないことに注意してください
(function (lambda (x) (* x 2)))
:マクロ展開時には、に展開されます。
だから、今上から3の例のように書くことができます。
(map (lambda (x) (* x 2)) '(1 2 3))
(defun (y) (lambda (x) (* x y)))
(defparameter *twice-fn* (lambda (x) (* x 2)))
それは少し短く、少しすっきり見え、Schemeコードに少し似ています。 Schemeコードの読み書きに使用されるプログラマーにとってはちょっと面白いです。
概要
A)(関数(ラムダ(X)(* X 2)))値としての機能を返すコードを書くための '本当' の方法です。
B)# '(ラムダ(X)(* X 2))
上記C)(ラムダ(X)(* X 2))の短い表記はさらに短くなるが、マクロ展開を使用していますa)の形式を作成する。
Lispは関数ポインタを持たず、マクロは可変領域にはありません... –