Mercurial > core / lisp/lib/obj/meta/pkg.lisp
changeset 356: |
aac665e2f5bf |
parent: |
ac705fd55056
|
child: |
9eb2c112aa16 |
author: |
Richard Westhaver <ellis@rwest.io> |
date: |
Tue, 21 May 2024 17:13:34 -0400 |
permissions: |
-rw-r--r-- |
description: |
stashed and revert some obj/color changes. added x/wayland feature splits, WITH-TCP-CLIENT and WITH-UDP-CLIENT impl (no tests) |
1 ;;; obj/meta/pkg.lisp --- Meta-objects 6 (defpackage :obj/meta/stealth 7 (:use :cl :std :obj/meta :sb-mop)) 9 (defpackage :obj/meta/typed 10 (:use :cl :std :obj/meta :sb-mop)) 12 (defpackage :obj/meta/filtered 13 (:use :cl :std :obj/meta :sb-mop) 15 :define-filtered-function :filtered :filtered-function :filtered-method 16 :generic-function-filter-expression :generic-function-filters :method-filter :simple-filtered-function)) 18 (defpackage :obj/meta/sealed 19 (:use :cl :std :obj/meta) 20 (:import-from :sb-pcl :eql-specializer :intern-eql-specializer 21 :eql-specializer-object :funcallable-standard-class) 22 (:import-from :sb-mop :class-finalized-p :finalize-inheritance 23 :class-precedence-list :class-direct-superclasses :specializer :method-specializers 24 :generic-function-argument-precedence-order :generic-function-name :generic-function-methods :class-direct-subclasses 29 :specializer-prototype 30 :specializer-direct-superspecializers 31 :specializer-intersectionp 42 :metaobject-sealable-p 44 :generic-function-sealable-p 46 :specializer-sealable-p 50 :generic-function-sealed-p 55 :seal-generic-function 61 :validate-method-property 63 :static-call-signature 64 :static-call-signature-types 65 :static-call-signature-prototypes 68 :compute-static-call-signatures 69 :externalizable-object-p 71 :sealable-generic-function 72 :sealable-standard-generic-function 73 :potentially-sealable-method 74 :potentially-sealable-standard-method)) 76 (defpackage :obj/meta/fast 77 (:use :cl :std :obj/meta/sealed :obj/meta) 78 (:import-from :sb-int :gensymify) 79 (:import-from :sb-walker :macroexpand-all) 80 (:export :fast-generic-function :fast-method :inlineable)) 82 (defpackage :obj/meta/lazy 83 (:use :cl :std :obj/meta)) 85 (defpackage :obj/meta/overloaded 86 (:use :cl :std :obj/meta)) 88 (in-package :obj/meta) 90 (defun class-equalp (c1 c2) 91 (when (symbolp c1) (setf c1 (find-class c1))) 92 (when (symbolp c2) (setf c2 (find-class c2))) 95 (defun type-specifier-and (&rest type-specifiers) 96 (let ((relevant (remove t type-specifiers))) 97 (cond ((null relevant) t) 98 ((null (cdr relevant)) (first relevant)) 99 (t `(and ,@relevant))))) 101 (defun type-specifier-or (&rest type-specifiers) 102 (let ((relevant (remove nil type-specifiers))) 103 (cond ((null relevant) nil) 104 ((null (cdr relevant)) (first relevant)) 105 (t `(or ,@relevant))))) 107 (defun type-specifier-not (type-specifier) 108 (cond ((eql type-specifier t) nil) 109 ((eql type-specifier nil) t) 110 (t `(not ,type-specifier)))) 112 (defparameter *standard-metaobjects* 113 (list (find-class 'standard-object) 114 (find-class 'standard-class) 115 (find-class 'standard-generic-function) 116 (find-class 'standard-method) 117 (find-class 'built-in-class))) 119 ;;; From ARNESI - Messing with the MOP 121 ;; https://bese.common-lisp.dev/docs/arnesi/html/Messing_0020with_0020the_0020MOP.html#wrapping-standard_0020method_0020combination 123 (define-method-combination wrapping-standard 124 (&key (around-order :most-specific-first) 125 (before-order :most-specific-first) 126 (primary-order :most-specific-first) 127 (after-order :most-specific-last) 128 (wrapping-order :most-specific-last) 129 (wrap-around-order :most-specific-last)) 130 ((wrap-around (:wrap-around)) 133 (wrapping (:wrapping)) 134 (primary () :required t) 136 "Same semantics as standard method combination but allows 137 \"wrapping\" methods. Ordering of methods: 146 :warp-around, :around, :wrapping and :primary methods call the 147 next least/most specific method via call-next-method (as in 148 standard method combination). 150 The various WHATEVER-order keyword arguments set the order in 151 which the methods are called and be set to either 152 :most-specific-last or :most-specific-first." 153 (labels ((effective-order (methods order) 155 (:most-specific-first methods) 156 (:most-specific-last (reverse methods)))) 157 (call-methods (methods) 158 (mapcar (lambda (meth) `(call-method ,meth)) 160 (let* (;; reorder the methods based on the -order arguments 161 (wrap-around (effective-order wrap-around wrap-around-order)) 162 (around (effective-order around around-order)) 163 (wrapping (effective-order wrapping wrapping-order)) 164 (before (effective-order before before-order)) 165 (primary (effective-order primary primary-order)) 166 (after (effective-order after after-order)) 167 ;; inital value of the effective call is a call its primary 169 (form (case (length primary) 170 (1 `(call-method ,(first primary))) 171 (t `(call-method ,(first primary) ,(rest primary)))))) 173 ;; wrap form in call to the wrapping methods 174 (setf form `(call-method ,(first wrapping) 175 (,@(rest wrapping) (make-method ,form))))) 177 ;; wrap FORM in calls to its before methods 179 ,@(call-methods before) 182 ;; wrap FORM in calls to its after methods 183 (setf form `(multiple-value-prog1 185 ,@(call-methods after)))) 187 ;; wrap FORM in calls to its around methods 188 (setf form `(call-method ,(first around) 190 (make-method ,form))))) 192 (setf form `(call-method ,(first wrap-around) 193 (,@(rest wrap-around) 194 (make-method ,form)))))