Help us understand the problem. What is going on with this article?

Common LispでSingletonなクラスを作る(CLOS)

More than 3 years have passed since last update.

Common LispでSingletonなクラスをCLOSで書くとどうなるのか?

考えてみた結果以下のような感じになった。

singleton.lisp
(defpackage foo
  (:use cl cl-user)
  (:export foo
           get-instance))
(in-package :foo)

;; fooクラスを定義する。
(defclass foo () ())

;; +instance+にインスタンスを格納。(この時点ではコンストラクタは呼び出し可能)
(defvar +instance+ (make-instance 'foo))

;; 新しいインスタンスを作れなくするためにコンストラクタを呼び出せないようにする
(defmethod initialize-instance :around ((this foo) &key) 
  (error "can't create instance."))

;; インスタンスを取得するための関数を作る。(defunで定義された関数をstaticなメソッドのように使う)
(defun get-instance ()
  +instance+)

(in-package :cl-user)

なんだかすっきりしない形になった。
もっといい方法があれば教えてください。

追記(2017/8/19)

以下コメントで紹介していただいたものたち。
便利なものがありますね。

Common Lisp

cl-singleton-mixin
singleton-classes

どちらもQuickLispから利用できる。

Gauche

singleton.scm

Gaucheは使ったことないのでよくわからないけどスレッドセーフなSingletonが作れそう。

kedama17
SIerやってます。 趣味でrubyとLISP(Common Lisp)を書いてます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away