#:g1: symbの紹介

Posted 2014-06-06 13:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の157日目です。

symbとはなにか

 symbは、CLISPの開発者で知られるSam Steingold氏作のシンボル関係のユーティリティです。

パッケージ情報

パッケージ名symb
プロジェクトサイト CLOCC - Common Lisp Open Code Collection / Hg / [e6b24a] /src/cllib/symb.lisp

インストール方法

 CLOCCのプロジェクトサイトからダウンロードしてきて適当に導入します。

$ hg clone http://hg.code.sf.net/p/clocc/hg clocc-hg

で全体のソースも取得できます。
src/cllib/symb.lisp が目的のソースです。

試してみる

 シンボルの生成系の関数が多いですが、exportされている関数をざっと眺めてみます。

symbol-concat
シンボル名を繋げたシンボルを生成。パッケージはデフォルトのもの
(cllib:symbol-concat :foo :- :bar)
;=>  FOO-BAR
;    NIL
symbol-append
symbol-concatと同じくシンボル名を繋げたシンボルを生成しますが、パッケージは最初の引数のシンボルになります。
(cllib:symbol-append :foo :- :bar)
;=>  :FOO-BAR
;    NIL
symbol-prepend
appendとは逆に前に追加
(cllib:symbol-prepend :bar :foo :-)
;=>  :FOO-BAR
;    :EXTERNAL
re-intern
一度uninternしてからinternしなおします。
いまいち使いどころの想像がつきませんが…。
(cllib:re-intern 'foo)
;=>  FOO
;    NIL
symbol-copy
シンボルをコピーしますが、cl:copy-symbolとは動作がかなり違って、-copynという接尾辞を付けます。
-copynがというシンボルをコピーしたら、-copy(n+1)となります。
(cllib:symbol-copy :foo)
;=>  :FOO-COPY-1
;    :EXTERNAL

(cllib:symbol-copy :FOO-COPY-1)
;=>  :FOO-COPY-2
;    NIL
kwd
キーワードを生成します。
(cllib:kwd 'foo)
;=>  :FOO
;    :EXTERNAL
keyword-concat
シンボルを接続して、キーワードを生成します。
(cllib:keyword-concat 'foo '- 'bar)
;=>  :FOO-BAR
;    :EXTERNAL
read-key
readした結果をキーワードにします。ちなみに一つしか読まない仕様です。
(with-input-from-string (in "foo")
  (cllib:read-key in))
;=>  :FOO
keyword=
キーワードを比較しますが、接尾辞を追加した状態で比較することも可能です。
(cllib:keyword= :foo :foo)
;=>  T

(cllib:keyword= :foo-p :foo :suffix2 :-p) ;=> T

kill-symbol
シンボルを消し去ります。変数セル、関数セル、plistの内容も消去した上にunintern。
(cllib:kill-symbol 'foo)
;=>  T

(find-symbol "FOO") ;=> NIL ; NIL

reset-package
パッケージ内のシンボルをkill-symbolします。
:deleteキーワード引数に非NILを与えれば、パッケージも削除。
ごちゃごちゃしてしまった場合に徹底的に削除したい場合などに便利かもしれません。
(defpackage :dial
  (:use)
  (:intern molito maliikto dialma dial dalto mahalito montino badi mamorlis))

(cllib:reset-package (find-package :dial)) ;>> ;; Cleaning #<PACKAGE "DIAL">...done (9 symbols killed) ;>> ;=> 9

まとめ

 今回は、symbを紹介してみました。
眺めてみると割合に便利そうです。
良く扱う割にはあまりきちんと理解されていないことが多いパッケージとシンボルですが、こういうユーティリティを使ったり、中身を読んだり、似たような物を作っていくと理解が深まるのではないかとも思います。

comments powered by Disqus