シンボルを文字列として扱いたい - lisp-cookbook-ja/common-lisp GitHub Wiki
シンボルを文字列として扱いたい
Common Lispでは、シンボルのシンボル名が文字列で格納されているため、シンボルも文字列のように扱うことが可能な場合が多くあります。 CLでは、これをstring designatorと呼び規定しています。
■利用例
(defpackage :foo ...)
(defpackage #:foo ...)
(in-package :foo)
...
シンボルからシンボル名を取り出すには、symbol-nameかstringを利用します。
"FOO"
;=> "FOO"
(symbol-name '#:foo)
;=> "FOO"
(symbol-name :foo) ;':foo, 'keyword:fooでも同じ。
;=> "FOO"
(symbol-name 'foo)
;=> "FOO"
"foo bar baz"
;=> "foo bar baz"
(symbol-name '|foo bar baz|)
;=> "foo bar baz"
(symbol-name :|foo bar baz|)
;=> "foo bar baz"
(symbol-name '#:|foo bar baz|)
;=> "foo bar baz"
(symbol-name '#:\f\o\o\ \b\a\r\ \b\a\z)
;=> "foo bar baz"
(string '#:\f\o\o\ \b\a\r\ \b\a\z)
;=> "foo bar baz"
(string= "FOO" 'foo)
;=> T
(equalp "FOO" 'FOO)
;=> nil
defpackage等で、#:fooや、:fooが利用される理由ですが、fooとするとfooシンボルがインターンされてしまい、意図しない名前の競合が発生することがあるためで、#:fooならば、どのパッケージにもインターンされず、:fooならば、キーワードパッケージにインターンされるのみとなります。この場合(defpackage "FOO" ..)と直接大文字で書いてしまえば良いのですが、主に大文字をタイプするのが面倒等の理由で最近では、#:fooや、:fooと書かれる傾向が強いようです。