いくつかの歴史的な参照が原因です。
Emacs LispはCommon Lispから多くのものを借りていますが、類似点は表面的な深さのみです。Common Lispのコロン記号は、名前空間修飾子です。正規シンボル名には2つの部分があります。パッケージの名前とそのパッケージ内のシンボルの名前です。たとえば、cl-user:apropos
はパッケージで定義されたシンボルcl-user
です。起動時にCommon Lispによって自動的にインポートされる特別なキーワードパッケージもあります。このパッケージは、他のパッケージ間の通信に使用されます(そのため、パッケージが相互にシンボリック情報を送信する必要がある場合、それらが誰を宣言する必要があるかを争うことはありません)。ご想像のとおり、そのパッケージのシンボルは先頭にコロンが付いています。
Emacs Lispにはパッケージの概念はありませんが、コロンは、式を自己評価記号として解釈するようにリーダーに指示するという点でまだ特別です(つまり、値はその変数自体である変数です)。:いくつかのような自己評価シンボル内蔵があるt
とnil
私は後で書こうしている例が。
アポストロフィはまた、Common Lispから借用されたもので、標準のリーダーマクロです(つまり、Lispインタープリターがプログラムのソースを読み取るときに実行するコードです)。以下のように拡張する:'x -> (quote x)
ここで、(quote ...)
式内部の内容を評価からのLispインタプリタを防止する特殊な形態です。Emacs Lispには、リーダーマクロ3を内蔵しています'
、`
そして#
、あなたはあなた自身を追加することはできません。最初の2つはに展開され(quote ...)
ますが、2番目は未評価の式を構築するための特別な構文を許可します。 フォームに#
展開(function ...)
され、関数の名前空間で値を検索する必要があることをインタープリターに指示します。
Emacs Lispのシンボルは、(他の言語の変数と同様に)ある値に評価する必要があります。そうでない場合、エラーになります。ただし、見積もりフォームを使用して評価を防ぐことができます。
最後に、以下の違い:
(search-forward "something" nil 'noerror)
そして
(search-forward "something" nil :noerror)
それは、最初のケースsearch-forward
では名前のみがわかっている値のないシンボルを使用して呼び出し、2番目のケースでは、値がこのシンボル自体であるシンボルを使用してこの関数を呼び出した場合です。たまたま、この関数はどちらを使用するかを気にしません。
タイプは、プログラムの自動検証のための重要なプログラミングツールです。Emacs Lisp型システムは、Common Lispと似ていますが、その汎用型(として記述t
)は、他のすべての型の派生元の型です。一方、nil
はタイプが派生しないタイプです(の補数t
)。これは、汎用型の概念がない、または明確なブール型を持つ多くの一般的なプログラミング言語とは異なります。
またしても、残念ながら、Emacs Lispには、Common Lispのから正確にこの部分をコピーしていなかった、とtype-of
関数がための結果を混乱与えますt
とnil
。
Emacs Lisp:
(type-of t) ; symbol
Common Lisp
(type-of t) ; BOOLEAN
Emacs Lispの一般的なLisp拡張機能cl-typep
には、関係を理解するのに役立つ機能があります。したがって、たとえば
(cl-typep 'noerror t) ; t
つまり、'noerror
それはタイプt
です。
nil
与えられた関数によってすべての非値が同じように扱われる場合、私のコードでは、関数の説明で使用されているパラメーター名と同じまたは類似の、通常は大文字のシンボルを渡します。これは、コードを読んだときの注意事項です。例えば(search-forward "abc" nil 'NOERROR)
。ほとんど使用されないオプションの引数に最も役立ちます。