changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/obj/meta/pkg.lisp

changeset 698: 96958d3eb5b0
parent: efb4a19ff530
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
234
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
1
 ;;; obj/meta/pkg.lisp --- Meta-objects
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
2
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
3
 ;;
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
4
 
575
efb4a19ff530 color palettes, obj/query upgrades and q/sql parsing - successfully parsing SQL-SELECT
Richard Westhaver <ellis@rwest.io>
parents: 373
diff changeset
5
 ;;; Commentary:
efb4a19ff530 color palettes, obj/query upgrades and q/sql parsing - successfully parsing SQL-SELECT
Richard Westhaver <ellis@rwest.io>
parents: 373
diff changeset
6
 
efb4a19ff530 color palettes, obj/query upgrades and q/sql parsing - successfully parsing SQL-SELECT
Richard Westhaver <ellis@rwest.io>
parents: 373
diff changeset
7
 
efb4a19ff530 color palettes, obj/query upgrades and q/sql parsing - successfully parsing SQL-SELECT
Richard Westhaver <ellis@rwest.io>
parents: 373
diff changeset
8
 ;;;; Notes:
efb4a19ff530 color palettes, obj/query upgrades and q/sql parsing - successfully parsing SQL-SELECT
Richard Westhaver <ellis@rwest.io>
parents: 373
diff changeset
9
 
efb4a19ff530 color palettes, obj/query upgrades and q/sql parsing - successfully parsing SQL-SELECT
Richard Westhaver <ellis@rwest.io>
parents: 373
diff changeset
10
 ;; ordered? https://www.reddit.com/r/lisp/comments/n88x59/metaclasses_using_structures_or_speeding_up_slot/
efb4a19ff530 color palettes, obj/query upgrades and q/sql parsing - successfully parsing SQL-SELECT
Richard Westhaver <ellis@rwest.io>
parents: 373
diff changeset
11
 
efb4a19ff530 color palettes, obj/query upgrades and q/sql parsing - successfully parsing SQL-SELECT
Richard Westhaver <ellis@rwest.io>
parents: 373
diff changeset
12
 ;;;; Ref:
efb4a19ff530 color palettes, obj/query upgrades and q/sql parsing - successfully parsing SQL-SELECT
Richard Westhaver <ellis@rwest.io>
parents: 373
diff changeset
13
 
efb4a19ff530 color palettes, obj/query upgrades and q/sql parsing - successfully parsing SQL-SELECT
Richard Westhaver <ellis@rwest.io>
parents: 373
diff changeset
14
 ;; https://franz.com/support/documentation/11.0/mop/concepts.html
efb4a19ff530 color palettes, obj/query upgrades and q/sql parsing - successfully parsing SQL-SELECT
Richard Westhaver <ellis@rwest.io>
parents: 373
diff changeset
15
 
234
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
16
 ;;; Code:
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
17
 (defpackage :obj/meta/stealth
356
aac665e2f5bf stashed and revert some obj/color changes. added x/wayland feature splits, WITH-TCP-CLIENT and WITH-UDP-CLIENT impl (no tests)
Richard Westhaver <ellis@rwest.io>
parents: 305
diff changeset
18
   (:use :cl :std :obj/meta :sb-mop))
234
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
19
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
20
 (defpackage :obj/meta/typed
356
aac665e2f5bf stashed and revert some obj/color changes. added x/wayland feature splits, WITH-TCP-CLIENT and WITH-UDP-CLIENT impl (no tests)
Richard Westhaver <ellis@rwest.io>
parents: 305
diff changeset
21
   (:use :cl :std :obj/meta :sb-mop))
234
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
22
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
23
 (defpackage :obj/meta/filtered
356
aac665e2f5bf stashed and revert some obj/color changes. added x/wayland feature splits, WITH-TCP-CLIENT and WITH-UDP-CLIENT impl (no tests)
Richard Westhaver <ellis@rwest.io>
parents: 305
diff changeset
24
   (:use :cl :std :obj/meta :sb-mop)
236
cb6effbda1dd more meta
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
25
   (:export
cb6effbda1dd more meta
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
26
    :define-filtered-function :filtered :filtered-function :filtered-method
cb6effbda1dd more meta
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
27
    :generic-function-filter-expression :generic-function-filters :method-filter :simple-filtered-function))
234
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
28
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
29
 (defpackage :obj/meta/sealed
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
30
   (:use :cl :std :obj/meta)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
31
   (:import-from :sb-pcl :eql-specializer :intern-eql-specializer
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
32
    :eql-specializer-object :funcallable-standard-class)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
33
   (:import-from :sb-mop :class-finalized-p :finalize-inheritance
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
34
    :class-precedence-list :class-direct-superclasses :specializer :method-specializers
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
35
    :generic-function-argument-precedence-order :generic-function-name :generic-function-methods :class-direct-subclasses
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
36
    :class-prototype)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
37
   (:export
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
38
    :ensure-specializer
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
39
    :specializer-type
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
40
    :specializer-prototype
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
41
    :specializer-direct-superspecializers
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
42
    :specializer-intersectionp
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
43
    :specializer-subsetp
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
44
    :domain
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
45
    :ensure-domain
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
46
    :method-domain
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
47
    :domain-specializers
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
48
    :domain-arity
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
49
    :domain-equal
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
50
    :domain-intersectionp
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
51
    :domain-subsetp
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
52
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
53
    :metaobject-sealable-p
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
54
    :class-sealable-p
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
55
    :generic-function-sealable-p
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
56
    :method-sealable-p
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
57
    :specializer-sealable-p
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
58
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
59
    :metaobject-sealed-p
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
60
    :class-sealed-p
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
61
    :generic-function-sealed-p
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
62
    :method-sealed-p
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
63
    :specializer-sealed-p
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
64
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
65
    :seal-class
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
66
    :seal-generic-function
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
67
    :seal-method
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
68
    :seal-domain
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
69
    :seal-specializer
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
70
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
71
    :method-properties
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
72
    :validate-method-property
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
73
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
74
    :static-call-signature
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
75
    :static-call-signature-types
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
76
    :static-call-signature-prototypes
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
77
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
78
    :sealed-domains
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
79
    :compute-static-call-signatures
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
80
    :externalizable-object-p
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
81
    :sealable-class
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
82
    :sealable-generic-function
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
83
    :sealable-standard-generic-function
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
84
    :potentially-sealable-method
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
85
    :potentially-sealable-standard-method))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
86
 
277
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents: 276
diff changeset
87
 (defpackage :obj/meta/fast
356
aac665e2f5bf stashed and revert some obj/color changes. added x/wayland feature splits, WITH-TCP-CLIENT and WITH-UDP-CLIENT impl (no tests)
Richard Westhaver <ellis@rwest.io>
parents: 305
diff changeset
88
   (:use :cl :std :obj/meta/sealed :obj/meta)
236
cb6effbda1dd more meta
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
89
   (:import-from :sb-int :gensymify)
cb6effbda1dd more meta
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
90
   (:import-from :sb-walker :macroexpand-all)
277
10faf95f90dd stream and basic type upgrades. fixed some bugs and improved csv parsing
Richard Westhaver <ellis@rwest.io>
parents: 276
diff changeset
91
   (:export :fast-generic-function :fast-method :inlineable))
234
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
92
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
93
 (defpackage :obj/meta/lazy
356
aac665e2f5bf stashed and revert some obj/color changes. added x/wayland feature splits, WITH-TCP-CLIENT and WITH-UDP-CLIENT impl (no tests)
Richard Westhaver <ellis@rwest.io>
parents: 305
diff changeset
94
   (:use :cl :std :obj/meta))
236
cb6effbda1dd more meta
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
95
 
cb6effbda1dd more meta
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
96
 (defpackage :obj/meta/overloaded
356
aac665e2f5bf stashed and revert some obj/color changes. added x/wayland feature splits, WITH-TCP-CLIENT and WITH-UDP-CLIENT impl (no tests)
Richard Westhaver <ellis@rwest.io>
parents: 305
diff changeset
97
   (:use :cl :std :obj/meta))
aac665e2f5bf stashed and revert some obj/color changes. added x/wayland feature splits, WITH-TCP-CLIENT and WITH-UDP-CLIENT impl (no tests)
Richard Westhaver <ellis@rwest.io>
parents: 305
diff changeset
98
 
373
9eb2c112aa16 refactor db stuff
Richard Westhaver <ellis@rwest.io>
parents: 356
diff changeset
99
 (defpackage :obj/meta/storable
9eb2c112aa16 refactor db stuff
Richard Westhaver <ellis@rwest.io>
parents: 356
diff changeset
100
   (:use :cl :std :obj/meta :obj/id)
9eb2c112aa16 refactor db stuff
Richard Westhaver <ellis@rwest.io>
parents: 356
diff changeset
101
   (:export
9eb2c112aa16 refactor db stuff
Richard Westhaver <ellis@rwest.io>
parents: 356
diff changeset
102
    :storable-class :initialize-storable-class
9eb2c112aa16 refactor db stuff
Richard Westhaver <ellis@rwest.io>
parents: 356
diff changeset
103
    :storable-slot-mixin :storable-direct-slot-definition
9eb2c112aa16 refactor db stuff
Richard Westhaver <ellis@rwest.io>
parents: 356
diff changeset
104
    :storable-effective-slot-definition))
9eb2c112aa16 refactor db stuff
Richard Westhaver <ellis@rwest.io>
parents: 356
diff changeset
105
   
356
aac665e2f5bf stashed and revert some obj/color changes. added x/wayland feature splits, WITH-TCP-CLIENT and WITH-UDP-CLIENT impl (no tests)
Richard Westhaver <ellis@rwest.io>
parents: 305
diff changeset
106
 (in-package :obj/meta)
305
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
107
 
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
108
 (defun class-equalp (c1 c2)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
109
   (when (symbolp c1) (setf c1 (find-class c1)))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
110
   (when (symbolp c2) (setf c2 (find-class c2)))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
111
   (eq c1 c2))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
112
 
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
113
 (defun type-specifier-and (&rest type-specifiers)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
114
   (let ((relevant (remove t type-specifiers)))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
115
     (cond ((null relevant) t)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
116
           ((null (cdr relevant)) (first relevant))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
117
           (t `(and ,@relevant)))))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
118
 
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
119
 (defun type-specifier-or (&rest type-specifiers)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
120
   (let ((relevant (remove nil type-specifiers)))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
121
     (cond ((null relevant) nil)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
122
           ((null (cdr relevant)) (first relevant))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
123
           (t `(or ,@relevant)))))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
124
 
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
125
 (defun type-specifier-not (type-specifier)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
126
   (cond ((eql type-specifier t) nil)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
127
         ((eql type-specifier nil) t)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
128
         (t `(not ,type-specifier))))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
129
 
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
130
 (defparameter *standard-metaobjects*
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
131
   (list (find-class 'standard-object)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
132
         (find-class 'standard-class)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
133
         (find-class 'standard-generic-function)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
134
         (find-class 'standard-method)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
135
         (find-class 'built-in-class)))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
136
 
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
137
 ;;; From ARNESI - Messing with the MOP
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
138
 
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
139
 ;; https://bese.common-lisp.dev/docs/arnesi/html/Messing_0020with_0020the_0020MOP.html#wrapping-standard_0020method_0020combination
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
140
 
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
141
 (define-method-combination wrapping-standard
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
142
     (&key (around-order :most-specific-first)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
143
           (before-order :most-specific-first)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
144
           (primary-order :most-specific-first)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
145
           (after-order :most-specific-last)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
146
           (wrapping-order :most-specific-last)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
147
           (wrap-around-order :most-specific-last))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
148
   ((wrap-around (:wrap-around))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
149
    (around (:around))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
150
    (before (:before))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
151
    (wrapping (:wrapping))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
152
    (primary () :required t)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
153
    (after (:after)))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
154
   "Same semantics as standard method combination but allows
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
155
 \"wrapping\" methods. Ordering of methods:
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
156
 
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
157
  (wrap-around
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
158
    (around
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
159
      (before)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
160
      (wrapping
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
161
        (primary))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
162
      (after)))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
163
 
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
164
 :warp-around, :around, :wrapping and :primary methods call the
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
165
 next least/most specific method via call-next-method (as in
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
166
 standard method combination).
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
167
 
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
168
 The various WHATEVER-order keyword arguments set the order in
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
169
 which the methods are called and be set to either
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
170
 :most-specific-last or :most-specific-first."
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
171
   (labels ((effective-order (methods order)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
172
              (ecase order
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
173
                (:most-specific-first methods)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
174
                (:most-specific-last (reverse methods))))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
175
            (call-methods (methods)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
176
              (mapcar (lambda (meth) `(call-method ,meth))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
177
                      methods)))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
178
     (let* (;; reorder the methods based on the -order arguments
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
179
            (wrap-around (effective-order wrap-around wrap-around-order))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
180
            (around (effective-order around around-order))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
181
            (wrapping (effective-order wrapping wrapping-order))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
182
            (before (effective-order before before-order))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
183
            (primary (effective-order primary primary-order))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
184
            (after (effective-order after after-order))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
185
            ;; inital value of the effective call is a call its primary
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
186
            ;; method(s)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
187
            (form (case (length primary)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
188
                    (1 `(call-method ,(first primary)))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
189
                    (t `(call-method ,(first primary) ,(rest primary))))))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
190
       (when wrapping
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
191
         ;; wrap form in call to the wrapping methods
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
192
         (setf form `(call-method ,(first wrapping)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
193
                                  (,@(rest wrapping) (make-method ,form)))))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
194
       (when before
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
195
         ;; wrap FORM in calls to its before methods
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
196
         (setf form `(progn
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
197
                       ,@(call-methods before)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
198
                       ,form)))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
199
       (when after
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
200
         ;; wrap FORM in calls to its after methods
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
201
         (setf form `(multiple-value-prog1
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
202
                         ,form
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
203
                       ,@(call-methods after))))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
204
       (when around
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
205
         ;; wrap FORM in calls to its around methods
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
206
         (setf form `(call-method ,(first around)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
207
                                  (,@(rest around)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
208
                                     (make-method ,form)))))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
209
       (when wrap-around
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
210
         (setf form `(call-method ,(first wrap-around)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
211
                                  (,@(rest wrap-around)
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
212
                                     (make-method ,form)))))
ac705fd55056 add base64 and wrapping-standard
Richard Westhaver <ellis@rwest.io>
parents: 277
diff changeset
213
       form)))