シンボルを文字列として扱いたい - lisp-cookbook-ja/common-lisp GitHub Wiki

文字列

シンボルを文字列として扱いたい

Common Lispでは、シンボルのシンボル名が文字列で格納されているため、シンボルも文字列のように扱うことが可能な場合が多くあります。 CLでは、これをstring designatorと呼び規定しています。

■利用例
(defpackage :foo ...)
(defpackage #:foo ...)
(in-package :foo)
...

シンボルからシンボル名を取り出すには、symbol-namestringを利用します。

"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と書かれる傾向が強いようです。