1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
;; this is the only part that depends on dynamic-classes
(in-package #:cl-containers)
(defvar *current-iteratee* nil)
(defmethod make-container ((classes list) &rest args)
(let ((name (find-or-create-class
'abstract-container classes)))
(apply #'make-instance name args)))
(add-parameter->dynamic-class
:iterator :transform 'transforming-iterator-mixin)
(add-parameter->dynamic-class
:iterator :filter 'filtered-iterator-mixin)
(add-parameter->dynamic-class
:iterator :unique 'unique-value-iterator-mixin)
(add-parameter->dynamic-class
:iterator :circular 'circular-iterator-mixin)
#+(or)
;;?? Gary King 2005-07-18: didn't work??
(add-dynamic-class-for-parameters :generator 'arithmetic-sequence-generator
nil '(:start :by))
(add-parameter->dynamic-class
:generator :start 'arithmetic-sequence-generator)
(add-parameter->dynamic-class
:generator :by 'arithmetic-sequence-generator)
(add-parameter->dynamic-class
:generator :transform 'transforming-iterator-mixin)
(add-parameter->dynamic-class
:generator :filter 'filtered-iterator-mixin)
(add-parameter->dynamic-class
:generator :unique 'unique-value-iterator-mixin)
(add-parameter->dynamic-class
:generator :end 'finite-arithmetic-sequence-generator)
(defmethod existing-subclass
((class-type (eql :iterator)) class-list)
(find-existing-subclass 'abstract-generator class-list))
(defmethod existing-subclass
((class-type (eql :generator)) class-list)
(find-existing-subclass 'abstract-generator class-list))
(defun determine-iterator-class (iteratee iterator-class &rest parameters)
(let ((*current-iteratee* iteratee))
(apply #'determine-dynamic-class
:iterator
iterator-class
parameters)))
(defun determine-generator-class (generator-class &rest parameters)
(apply #'determine-dynamic-class
:generator generator-class parameters))
(defmethod include-class-dependencies
((class-type (eql :iterator))
dynamic-class class-list &rest parameters
&key treat-contents-as &allow-other-keys)
(declare (ignore dynamic-class parameters))
(append class-list
(list
(or
(and treat-contents-as
(class-for-contents-as *current-iteratee* treat-contents-as))
(base-class-for-iteratee *current-iteratee*)))))
;;;;
(defmethod class-for-contents-as ((contents t) (as t))
(values nil))
(defmethod base-class-for-iteratee ((container list))
'list-iterator)
(defmethod base-class-for-iteratee ((container array))
'array-iterator)
(defmethod base-class-for-iteratee ((container hash-table))
'hash-table-iterator)
(defmethod base-class-for-iteratee ((container uses-contents-mixin))
(base-class-for-iteratee (contents container)))
|