git.fiddlerwoaroof.com
Raw Blame History
(defpackage :patmatch/test
  (:use :cl)
  (:import-from :parachute
                #:true #:false #:fail #:is #:isnt #:is-values #:isnt-values
                #:of-type #:finish #:define-test)
  (:import-from :patmatch :let-pat*)
  (:export ))
(in-package :patmatch/test)

(defclass test-base ()
  ((a :initform 1)))

(defclass test-sub1 (test-base)
  ())

(defclass test-sub2 (test-base)
  ((b :initform 2)))

(eval-when (:compile-toplevel :load-toplevel :execute)
  (closer-mop:ensure-class 'test-base)
  (closer-mop:ensure-class 'test-sub1)
  (closer-mop:ensure-class 'test-sub2))

(defmethod patmatch:handle-pattern append ((pattern test-base) form &rest args)
  (alexandria:when-let ((arg (getf args :a)))
    (let ((val-sym (gensym "test-base-")))
      `((,val-sym ,form)
        ,@(serapeum:unsplice
           `(,arg (slot-value ,val-sym 'a)))))))

(defmethod patmatch:handle-pattern append ((pattern test-sub2) form &rest args)
  (alexandria:when-let ((arg (getf args :b)))
    (let ((val-sym (gensym "test-base-")))
      `((,val-sym ,form)
        ,@(serapeum:unsplice
           `(,arg (slot-value ,val-sym 'b)))))))