LoginSignup
0
0

More than 5 years have passed since last update.

CLOSでaccessorとmethodの名前衝突を回避する

Posted at

目的

パッケージを分けて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)

xyがぶつかる。
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っぽくないかも?

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0