例えば、 #'functionname
、 必要ですか?
# '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 を参照してください。