読者です 読者をやめる 読者になる 読者になる

kiyo_hikoのブログ

メモ+日記?

シンボルとパッケージを学んだ

CommonLisp

パッケージ名は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)