2012-03-07 9 views
0

可能性の重複:
What does # mean in LISPLispの中に# 'を入れる必要があるのはなぜですか?

私はlispの勉強が、それは使用する#」のために必要である理由私は理解していない一つのことです。特定の名前を持つ関数が存在する場合、なぜlispはその変数を考えるのでしょうか? 例:

>(remove-if-not #'evenp '(1 2 3 4 5 6 7 8 9 10)) 
(2 4 6 8 10) 
+2

これは前に回答しています:http://stackoverflow.com/questions/4873810/what-does-mean-in-lisp –

+0

私はお詫び申し上げます。リスティングを削除する必要がありますか? – Andy

答えて

4

Lispの中には、Common Lispと同様に、これが必要です。他のものは、Schemeのように、しません。

あなたが使用しているLispには、関数と "通常の"変数のための別々の名前空間があるので、これを行う必要があります。 #'を省略した場合、シンボルevenpは、 "通常の"(機能していない)名前空間を参照するものとして解釈されます。

+0

迅速な対応をありがとう。私は、少なくとも共通のlispでは、この方法でlispを分けたことを知らなかった。とても有難い。 – Andy

3

読み取り構文

#'X 

(FUNCTION X) 

(FUNCTIONのX)を意味し、大体、「の名前空間におけるシンボルXを解決するとまったく同じことを意味し、機能"。これがなければ、Xは変数として評価されます。関数と変数はCommon Lispの別々の名前空間にあります。これはルールです。

なぜ、Lispはそれが変数だと思いますか?別の言い方をすると、2つの名前空間があるとしたら、あいまいさがなければ、Lispを自動的にどちらか一方に自動的に戻すことができないのですか?その理由は、Lisp-1またはLisp-2と比較して、どちらかというよりも悪いハッキングになるからです。 Lisp-1とLisp-2は、Lisp文化において変数のための単一の名前空間と2つの名前空間を持つ方言を参照するために使われる単語です。

これを行う方法の賛否両論については、ケント・ピットマンとリチャード・ガブリエルの論文[http://www.nhplace.com/kent/Papers/Technical-Issues.html]を参照してください。[機能セルとバリューセルの分離の技術的課題]

脇に:あなたは 'FUNC'または(QUOTE FUNC)の代わりに(remove-if-not 'evenp ...)を使うことができます。これはシンボルを通過する非常に遅いバインドメカニズムであり、レキシカル関数では機能しません。それはおそらく非常に効率的にコンパイルされません。 'FUNC'を呼び出すことは常にシンボルを通してルックアップを行う必要がありますが、(少なくともいくつかの重要な状況では)# 'FUNCを最適化することができます。

+0

お返事ありがとうございます。この例は私が使っている本のものですから、私のコードでは使用しませんが、アドバイスをいただければ幸いです。 – Andy

関連する問題