Generic Function Copy-Template (1 method)

( copy-template < object > )

Part of:

package metabang.moptilities


Suppose you make an instance of the class foo:

(defclass foo ()
((test :accessor test :initform #'equal :initarg :test)))

(setf foo (make-instance 'foo :test #'eql))

Its test slot will be set to #'eql:

(test foo) => #'eql

If you want to make a structural clone (for lack of a better term)
of *foo*, you might try:

(setf new-foo (make-instance (type-of foo)))

But *new-foo*'s test slot won't be set properly:

(test new-foo) => #'equal

For simple classes, this is no problem but suppose we have
a graph from CL-Graph and want to make a copy of that:

(make-graph (type-of old-graph)
:vertex-test (vertex-test old-graph)
:vertex-key (vertex-key old-graph)
:edge-test (edge-test old-graph)
:edge-key (edge-key old-graph)
:default-edge-type (default-edge-type old-graph)
:default-edge-class (default-edge-class old-graph)
:directed-edge-class (directed-edge-class old-graph)
:undirected-edge-class (undirected-edge-class old-graph))))

Yuck!

Copy-template is a reasonable, though not perfect, solution to this
problem; it creates a structural copy of an object as such that the copy
has all of its initargs correctly set.

[CL-Graph]: http://common-lisp.net/projects/cl-graph/

Method Summary

copy-template < standard-object >