Skip to content

Instantly share code, notes, and snippets.

@flambard
Last active August 29, 2015 13:55
Show Gist options
  • Save flambard/8730585 to your computer and use it in GitHub Desktop.
Save flambard/8730585 to your computer and use it in GitHub Desktop.
Pattern matching simple vectors in Optima.
(defstruct (simple-vector-pattern (:include constructor-pattern)
(:constructor make-simple-vector-pattern (&rest subpatterns))))
(defmethod destructor-equal ((x simple-vector-pattern) (y simple-vector-pattern))
(= (constructor-pattern-arity x)
(constructor-pattern-arity y)))
(defmethod destructor-predicate-form ((pattern simple-vector-pattern) var)
`(typep ,var '(simple-vector ,(constructor-pattern-arity pattern))))
(defmethod destructor-forms ((pattern simple-vector-pattern) var)
(loop for i from 0 below (constructor-pattern-arity pattern)
collect `(svref ,var ,i)))
(defmethod parse-constructor-pattern ((name (eql 'simple-vector)) &rest args)
(apply #'make-simple-vector-pattern (mapcar #'parse-pattern args)))
(defmethod unparse-pattern ((pattern simple-vector-pattern))
`(simple-vector ,@(mapcar #'unparse-pattern (simple-vector-pattern-subpatterns pattern))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment