close Warning: Can't synchronize with repository "(default)" (The repository directory has changed, you should resynchronize the repository with: trac-admin $ENV repository resync '(default)'). Look in the Trac log for more information.

source: branches/f4grobner/copy.lisp@ 3451

Last change on this file since 3451 was 3445, checked in by Marek Rychlik, 9 years ago

* empty log message *

File size: 2.8 KB
Line 
1;;; -*- mode: lisp; package: maxima; syntax: common-lisp; base: 10 -*-
2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3;;;
4;;; copyright (c) 1999, 2002, 2009, 2015 marek rychlik <rychlik@u.arizona.edu>
5;;;
6;;; this program is free software; you can redistribute it and/or modify
7;;; it under the terms of the gnu general public license as published by
8;;; the free software foundation; either version 2 of the license, or
9;;; (at your option) any later version.
10;;;
11;;; this program is distributed in the hope that it will be useful,
12;;; but without any warranty; without even the implied warranty of
13;;; merchantability or fitness for a particular purpose. see the
14;;; gnu general public license for more details.
15;;;
16;;; you should have received a copy of the gnu general public license
17;;; along with this program; if not, write to the free software
18;;; foundation, inc., 59 temple place - suite 330, boston, ma 02111-1307, usa.
19;;;
20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
21
22(defpackage "COPY"
23 (:use :cl)
24 (:export "COPY-INSTANCE")
25 (:shadowing-import-from
26 #+openmcl-native-threads #:ccl
27 #+cmu #:pcl
28 #+sbcl #:sb-pcl
29 #+lispworks #:hcl
30 #+allegro #:mop
31 #+clisp #:clos
32 #:class-slots #:slot-definition-name)
33 (:documentation
34 "Implements ring operations. These are all operations that are
35performed on the coefficients by the package, and thus the coefficient
36ring can be changed by merely redefining these operations."))
37
38(in-package :copy)
39
40
41;; Source: http://stackoverflow.com/questions/11067899/is-there-a-generic-method-for-cloning-clos-objects
42;; NOTE: This is a shallow copy. Add an around method for classes which need deep copy of the slots.
43(defgeneric copy-instance (object &rest initargs &key &allow-other-keys)
44 (:method ((object cons) &rest initargs &key &allow-other-keys)
45 (declare (ignore initargs))
46 (copy-seq object))
47 (:documentation "Makes and returns a shallow copy of OBJECT.
48
49 An uninitialized object of the same class as OBJECT is allocated by
50 calling ALLOCATE-INSTANCE. For all slots returned by
51 CLASS-SLOTS, the returned object has the
52 same slot values and slot-unbound status as OBJECT.
53
54 REINITIALIZE-INSTANCE is called to update the copy with INITARGS.")
55 (:method ((object standard-object) &rest initargs &key &allow-other-keys)
56 (let* ((class (class-of object))
57 (copy (allocate-instance class)))
58 (dolist (slot-name (mapcar #'slot-definition-name (class-slots class)))
59 (when (slot-boundp object slot-name)
60 (setf (slot-value copy slot-name)
61 (slot-value object slot-name))))
62 (apply #'reinitialize-instance copy initargs))))
Note: See TracBrowser for help on using the repository browser.