シンボル - Alexandria

概要

このページでは、Common Lispの汎用ライブラリであるAlexandriaのシンボルに関するオペレータを紹介します。

ensure-symbol関数: シンボルのインターン

ANSI Common Lispでは第11章「パッケージ」でinternという関数が定められており、文字列とパッケージを引数に取ることでその文字列からシンボルを生成し、パッケージに所属させることができます。

intern関数の第1引数は文字列でなければなりませんが、Alexandriaのensure-symbol関数はシンボルを引数に取ることができるため、大文字にする必要はありません。
(alexandria:ensure-symbol 'hello)
; => HELLO ;
;    :INTERNAL

(export 'hello)
; => T

(alexandria:ensure-symbol 'hello)
; => HELLO ;
;    :EXTERNAL
動作はintern関数と同じです。返り値の1番目は生成されたシンボル、2番目はシンボルの状態です。もちろん、該当するシンボルが存在する場合は新たに生成されることはありません。

format-symbol関数: シンボルの完全なフォーマット

シンボルを完全な形式で表示したい場合はformat-symbol関数を使うことができます。
(shadowing-import 'alexandria:format-symbol)
; => T

;; 普通のformatはシンプルな出力を行う
(format nil "~s" 'hello)
; => "HELLO"

;; Alexandriaのformat-symbolは丁寧な出力を行う
(format-symbol t "~s" 'hello)
; => |\|COMMON-LISP-USER\|::\|HELLO\||

;; 第1引数をnilにするとインターンされていないシンボルになる
(format-symbol nil "~s" 'hello)
; => #:|\|COMMON-LISP-USER\|::\|HELLO\||

;; パッケージを指定することもできる
(format-symbol :alexandria "~s" 'with-gensyms)
; => ALEXANDRIA.0.DEV::|\|EXT\|::\|WITH-GENSYMS\||

make-keyword関数: キーワードシンボルの生成

Common Lispにおいて「キーワード」とは、KEYWORDパッケージに属するシンボルのことです(参考:第11章「パッケージ」)。キーワードはコロン:を付けて示すことで即KEYWORDパッケージにインターンされます。そのため、明示的な生成は不要です。

Alexandriaのmake-keyword関数はキーワードの生成を関数を通じて明示的に行いたい場合に利用します。
(alexandria:make-keyword "FOO")
; => :FOO ;
;    :EXTERNAL

make-gensym関数: 数または文字列を使用したユニークシンボルの生成

ANSI Common Lispのgensym関数は通常何も引数を付けずに評価してランダムなユニークシンボル(どのパッケージにも属さないシンボル)を生成しますが、数や文字列を指定しすることもできます。

Alexandriaのmake-gensym関数はその機能を少し拡張子、文字列の代わりに文字列指定子となるようなシンボルまたは文字でもgensym関数が動作するようにしているものです。
(alexandria:make-gensym #\a)
; => #:|a9207|

(alexandria:make-gensym 'hello)
; => #:HELLO9206
これらはいずれもgensym関数ではエラーになります。

なお、gensym関数に数の引数を与えることはANSI標準で非推奨とされているので注意してください。

make-gensym-list関数: 複数のユニークシンボルの生成

変わり種のオペレータもあります。複数回のgensymを行い、ユニークシンボルをいくつも作るというオペレータです。
(alexandria:make-gensym-list 5)
; => (#:G9218 #:G9219 #:G9220 #:G9221 #:G9222)
第2引数はオプショナルで、make-gensym関数と同じような指定をすることも可能です。

symbolicate関数: シンボルと文字列の連結してシンボルの生成する

複数のシンボルや文字列を連結して、新しいシンボルを生成する関数も用意されています。symbolicate関数です。
(alexandria:symbolicate 'hello "-World")
; => |HELLO-World|

0 件のコメント :

コメントを投稿