シンボルとパッケージを学んだ
パッケージ名はCCL環境による。メモる
記号
システムはケースの大小を無視
nilなら8パターンあるが、1パターンを印字名として覚えてる。
(symbol-name nil)
パイプを使うと記号に特殊文字や小文字を持たせられる。
(defun |(test)| (x) (* x x)) ;;-> |(test)| (|(test)| 100) ;;->10000
または一文字ならバックスラッシュを使う。
パッケージ
in-packageはカレントパッケージ切り替え
make-packageで作るっぽい
外部シンボルはexportで作る。[:」で参照可能で、外から使ってもいいという意思表示?
内部記号は「::」で見れてしまう。使うなという意思表示?
;; カレントパッケージ (setf *package* (find-package 'common-lisp-user)) ;; パッケージ作る (make-package 'uhoho) (in-package 'uhoho) 'upopo ; 記号を評価するとパッケージに登録される → インターン? (export 'uhyo) (in-package 'common-lisp-user) (import 'uhoho:uhyo) (import 'uhoho::upopo) (symbol-package 'upopo) ;;->#<Package "UHOHO"> (in-package 'uhoho) (defun umomo (x) (* x x x)) (export 'umomo) (in-package 'common-lisp-user) (uhoho:umomo 5) (use-package 'uhoho) (in-package 'common-lisp) (use-package 'uhoho 'common-lisp-user) (in-package 'common-lisp-user) (umomo 5)
リストアップ
common-lispパッケージはシステムが用意してる記号を利用するため、自動的にuseされる。
パッケージの記号を見るには、do-symbolsを使って、
(do-symbols (s (find-package 'common-lisp) nil) (print s)) ;; 外部記号だけ (do-external-symbols (s (find-package 'common-lisp) nil) (print s))
パッケージの一覧
(list-all-packages)
インターン
システムが暗黙にやってる模様。
システムに記号を評価させた場合、
1.カレントパッケージに記号が既にあればそれを返す
2.なかったらuseしてるパッケージにないかみる
3.どうしてもなければ作る
(intern "uhoho")
多値関数で記号と状態を返す
- :internal -> 内部記号だった
- :external
- :inherited -> useしたものから取ってきた
- nil -> 新しく作った
シャドウ
(shadow 'if) (defun if (x) (* x x x x)) (if 100) ;;->100000000
gensym、gentemp
(gensym) (gensym "prefix-") (symbol-package (gensym)) ;;->ホームパッケージはない。nil (gentemp)