2009年2月15日日曜日

【実践CL】21 大規模開発に向けて:パッケージとシンボル

パッケージとシンボルは、いろんな機会で自分なりに整理してきたので、軽く復習というノリで。


;;;
;;; 21 大規模開発に向けて:パッケージとシンボル
;;;


;; 21.1 読取器はパッケージをどうやって使うか

*package* ;#<The COMMON-LISP-USER package>
(find-symbol "CAR") ;CAR, :INHERITED
(find-symbol "CAR" (find-package "COMMON-LISP"))
;CAR, :EXTERNAL
(find-symbol "car") ;NIL, NIL

(find-symbol "PIYO") ;NIL, NIL
(intern "PIYO") ;PIYO, NIL
(find-symbol "PIYO") ;PIYO, :INTERNAL

(eql ':foo :foo) ;T

(symbol-name :foo) ;"FOO"

(eql '#:foo '#:foo) ;NIL

(symbol-name '#:foo) ;"FOO"
(symbol-package '#:foo) ;NIL

(defparameter *pair-1* (cons '#:foo (intern "FOO")))
(defparameter *pair-2* (cons '#:foo (intern "FOO")))

(eql *pair-1* *pair-2*) ;NIL
(equal *pair-1* *pair-2*) ;NIL
(equal (car *pair-1*) (car *pair-2*)) ;NIL

(eql (car *pair-1*) (car *pair-2*)) ;NIL
(eql (cdr *pair-1*) (cdr *pair-2*)) ;T

(setf (symbol-value (car *pair-1*)) 1) ;1
(symbol-value (car *pair-1*)) ;1

(defparameter *a* '#:foo)
(type-of *a*) ;SYMBOL
(symbol-value *a*) ;Error: Attempt to take the value of the unbound variable `#:FOO'.
(setf (symbol-value *a*) 10)
(symbol-value *a*) ;10

(defparameter *b* *a*)
(symbol-value *b*) ;10

(gensym) ;#:G7


;; 21.2 パッケージとシンボルの用語をいくつか

;; 特になし。


;; 21.3 3つの標準パッケージ

*package* ; #<The COMMON-LISP-USER package>
common-lisp:*package* ; #<The COMMON-LISP-USER package>
cl:*package* ; #<The COMMON-LISP-USER package>
:a ;:A
keyword:a ;:A
(eql :a keyword:a) ;T


;; 21.4 自分でパッケージを定義する

(defpackage :util.aka
(:use :common-lisp))

excl::*package-table*

(in-package :util.aka)


;; 21.5 再利用可能なライブラリのパッケージ化

(defpackage :util.aka
(:use :common-lisp)
(:export :open-db
:save
:store))

;; 21.6 個別の名前をインポートする

;; On REPL
(in-package :util.aka)
(asdf:operate 'asdf:load-op :cxml)
(defpackage :util.aka
(:use :common-lisp)
(:import-from :cxml :parse))
(find-symbol "PARSE") ;PARSE, :INTERNAL

(defpackage :util.aka
(:use :common-lisp :cxml)
(:shadow :parse))


;; 21.7 パッケージ化の定石

;; 特になし

;; 21.8 パッケージの悩みどころ

;; 特になし


こつこつ。

0 件のコメント: