2009-05-26 20 views
13

ラムダと一緒に# 'を使用するのはなぜですか?それは通常そのように書かれているので、それは良い形だと思います。しかし、これらの行は私と同じように見えます:ラムダで# 'を使用する理由は?

> (mapcar #'(lambda (x) (+ x 1)) '(1 2 3)) 
(2 3 4) 
> (mapcar (lambda (x) (+ x 1)) '(1 2 3)) 
(2 3 4) 

初心者には違いを教えてください。

答えて

11

#'は、functionの省略形で、(適用する代わりに)関数へのポインタを返します。 lambdaは関数を返します。通常、その関数へのポインタが必要です。これは非常に一般的なので、あなたのためにそれを行うマクロ(変数空間内)もあります。これはlambdaと同様です。両方のコード行は同じです。

どちらが良いのはLisp-1/Lisp-2 debateです:Common Lispでは、マクロのおかげでいずれかを行うことができます。いつものように、一貫してください。

+0

Lispは関数ポインタを持たず、マクロは可変領域にはありません... –

14

さまざまな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)の形式を作成する。

関連する問題