目的
パッケージを分けてdefmethodしている場合に総称関数の名前の衝突を回避したい。
名前の衝突
clos-sym.lisp
;; foo
(in-package :cl-user)
(defpackage pfoo
(:use :cl)
(:export :foo
:x
:y))
(in-package :pfoo)
(defclass foo ()
((x :accessor x
:initform 1
:initarg :x)))
(defmethod y ((foo foo))
(print "foo"))
(in-package :cl-user)
;; bar
(in-package :cl-user)
(defpackage pbar
(:use :cl)
(:export :bar
:x
:y))
(in-package :pbar)
(defclass bar ()
((x :accessor x
:initform 2
:initarg :x)))
(defmethod y ((bar bar))
(print "bar"))
(in-package :cl-user)
(use-package :pfoo)
(use-package :pbar)
x
とy
がぶつかる。
use-package
しなければいいけど、それだとパッケージを指定しなくてはいけない。
キーワードを使う
clos-kw.lisp
;; foo
(in-package :cl-user)
(defpackage pfoo
(:use :cl)
(:export :foo))
(in-package :pfoo)
(defclass foo ()
((x :accessor :x
:initform 1
:initarg :x)))
(defmethod :y ((foo foo))
(print "foo"))
(in-package :cl-user)
;; bar
(in-package :cl-user)
(defpackage pbar
(:use :cl)
(:export :bar))
(in-package :pbar)
(defclass bar ()
((x :accessor :x
:initform 2
:initarg :x)))
(defmethod :y ((bar bar))
(print "bar"))
(in-package :cl-user)
(use-package :pfoo)
(use-package :pbar)
書き方が(:y foo)
や(:x foo)
みたいになるけど、衝突はおきない。
Common Lispっぽくないかも?