web-dev-qa-db-ja.com

LISPで#はどういう意味ですか

例えば、 #'functionname、 必要ですか?

30
Thomson

# 'Common LISPの関数名

一般的なLISPおよび他のいくつかのLISP方言には、複数の名前空間があります。ここでは、関数と値のものが異なります。名前の関数値を取得するには、次のように記述する必要があります。

(function functionname)

それを書くのは少し長いので、より短い表記があります:

#'functionname

効果を表示するには、次を参照してください。

(let ((foo 42))
  (flet ((foo () 'bar))
    (list foo (function foo) #'foo (foo))))

上記はローカル変数FOOローカル関数FOOを定義しています。 listステートメントは、FOOの-​​valueを返し、次に(function ...)表記を使用してfooの-​​function valueを返し、次に短縮表記を使用してから、実際に関数FOOを呼び出す値を使用して同じです。

(function foo)#'fooは同じ概念ですが、記述が異なります。どちらもFOOという名前のローカル字句関数を参照します。 FOOは、FLETフォームによってローカル関数として導入されます。

LISP REPLは次のようなものを返します:

(42 #<function FOO 4060008224> #<function FOO 4060008224> BAR)

上記は、最初の項目が実際には変数FOOの-​​valueであり、次の2つの項目がfunction valuesであり、関数がFOO。最後の項目は、関数呼び出し(FOO)から返されるシンボルBARです。

通常の値と関数値の名前空間のこの分離は、Common LISP、Emacs LISP、およびISLispに存在します。 Schemeのような他のLISP方言にはその分離がありません。スキームでは、名前は1つの値のみを表すことができます。

#文字

#文字は、S式に特別な構文を導入するために使用されます。ここではいくつかの例を示します。

#'functionname   ->  (function functionname)
#(1 2 3)         ->  the vector of the elements 1 2 3
#c(1 2)          ->  a complex number
#xFFFF           ->  a hex number
#b1111           ->  a binary number

などなど。 #はいわゆるディスパッチングマクロ文字です。

ANSI Common LISP HyperSpecは、 セクション2.4.8 Sharpsign#文字を記述します。

Common LISPは、ベクトルに異なる構文を使用する可能性があります。 [1 2 3]と言います。また、複素数に異なる構文を使用することもできます。 {1 2}のようなもの。しかし、それはしません。どうして?その理由は、Common LISPは言語での文字の使用を経済的にしようとし、[]{}などの文字をユーザーに任せるためです。独自の構文拡張。多くの場合、LISPユーザーは埋め込み言語を開発し、それを少し簡単にするために、Common LISP標準は文字の使用を最小限に抑えようとし、マクロ文字とディスパッチマクロ文字のメカニズムも提供します。

文字の使用を抑えるために、単一のディスパッチ文字#が使用され、次の文字が何を表すことができるかを決定します。 2進数の場合は#b#x(16進数の場合)。 #c複素数の場合。ベクトルの場合は#(。関数名の場合は#'。さらに多く。

Common LISPはプログラム可能なプログラミング言語であるため、この文字レベルの構文はユーザーが変更できます。関数 SET-DISPATCH-MACRO-CHARACTER を参照してください。

67
Rainer Joswig