changeset 594: | 5bd0eb9fa1fa |
parent: | 83f8623a6ec3 |
author: | Richard Westhaver <ellis@rwest.io> |
date: | Wed, 14 Aug 2024 21:49:56 -0400 |
permissions: | -rw-r--r-- |
description: | rocksdb callbacks, missing symbol fixes |
291 | 1 | ;;; pan.lisp --- Pandoric macros |
2 | ||
3 | ;;; Code: |
|
437
83f8623a6ec3
std work, renamed :disabled in deftest to :skip
Richard Westhaver <ellis@rwest.io>
parents:
292
diff
changeset
|
4 | (in-package :std/macs) |
291 | 5 | (in-readtable :std) |
6 | ||
7 | (defun pandoriclet-get (letargs) |
|
8 | `(case sym |
|
292
00d1c8afcdbb
mostly done with std refactor, added sst-file-writer to rdb
Richard Westhaver <ellis@rwest.io>
parents:
291
diff
changeset
|
9 | ,@(mapcar #`(((car ,a1)) (car ,a1)) |
291 | 10 | letargs) |
11 | (t (error |
|
12 | "Unknown pandoric get: ~a" |
|
13 | sym)))) |
|
14 | ||
15 | (defun pandoriclet-set (letargs) |
|
16 | `(case sym |
|
292
00d1c8afcdbb
mostly done with std refactor, added sst-file-writer to rdb
Richard Westhaver <ellis@rwest.io>
parents:
291
diff
changeset
|
17 | ,@(mapcar #`(((car ,a1)) |
00d1c8afcdbb
mostly done with std refactor, added sst-file-writer to rdb
Richard Westhaver <ellis@rwest.io>
parents:
291
diff
changeset
|
18 | (setq (car ,a1) val)) |
291 | 19 | letargs) |
20 | (t (error |
|
21 | "Unknown pandoric set: ~a" |
|
22 | sym)))) |
|
23 | ||
24 | (defmacro pandoriclet (letargs &rest body) |
|
25 | (let ((letargs (cons |
|
594
5bd0eb9fa1fa
rocksdb callbacks, missing symbol fixes
Richard Westhaver <ellis@rwest.io>
parents:
437
diff
changeset
|
26 | '(%a) |
437
83f8623a6ec3
std work, renamed :disabled in deftest to :skip
Richard Westhaver <ellis@rwest.io>
parents:
292
diff
changeset
|
27 | (std/list:let-binding-transform |
291 | 28 | letargs)))) |
29 | `(let (,@letargs) |
|
594
5bd0eb9fa1fa
rocksdb callbacks, missing symbol fixes
Richard Westhaver <ellis@rwest.io>
parents:
437
diff
changeset
|
30 | (setq %a ,@(last body)) |
291 | 31 | ,@(butlast body) |
32 | (dlambda |
|
33 | (:pandoric-get (sym) |
|
34 | ,(pandoriclet-get letargs)) |
|
35 | (:pandoric-set (sym val) |
|
36 | ,(pandoriclet-set letargs)) |
|
37 | (t (&rest args) |
|
594
5bd0eb9fa1fa
rocksdb callbacks, missing symbol fixes
Richard Westhaver <ellis@rwest.io>
parents:
437
diff
changeset
|
38 | (apply %a args)))))) |
291 | 39 | |
40 | (declaim (inline get-pandoric)) |
|
41 | ||
42 | (defun get-pandoric (box sym) |
|
43 | (funcall box :pandoric-get sym)) |
|
44 | ||
45 | (defsetf get-pandoric (box sym) (val) |
|
46 | `(progn |
|
47 | (funcall ,box :pandoric-set ,sym ,val) |
|
48 | ,val)) |
|
49 | ||
50 | (defmacro! with-pandoric (syms o!box &rest body) |
|
51 | `(symbol-macrolet |
|
292
00d1c8afcdbb
mostly done with std refactor, added sst-file-writer to rdb
Richard Westhaver <ellis@rwest.io>
parents:
291
diff
changeset
|
52 | (,@(mapcar #`(,a1 (get-pandoric ,g!box ,a1)) |
291 | 53 | syms)) |
54 | ,@body)) |
|
55 | ||
56 | ;; (defun pandoric-hotpatch (box new) |
|
594
5bd0eb9fa1fa
rocksdb callbacks, missing symbol fixes
Richard Westhaver <ellis@rwest.io>
parents:
437
diff
changeset
|
57 | ;; (with-pandoric (%a) box |
5bd0eb9fa1fa
rocksdb callbacks, missing symbol fixes
Richard Westhaver <ellis@rwest.io>
parents:
437
diff
changeset
|
58 | ;; (setq %a new))) |
291 | 59 | |
60 | (defmacro pandoric-recode (vars box new) |
|
594
5bd0eb9fa1fa
rocksdb callbacks, missing symbol fixes
Richard Westhaver <ellis@rwest.io>
parents:
437
diff
changeset
|
61 | `(with-pandoric (%a ,@vars) ,box |
5bd0eb9fa1fa
rocksdb callbacks, missing symbol fixes
Richard Westhaver <ellis@rwest.io>
parents:
437
diff
changeset
|
62 | (setq %a ,new))) |
291 | 63 | |
64 | (defmacro plambda (largs pargs &rest body) |
|
65 | (let ((pargs (mapcar #'list pargs))) |
|
594
5bd0eb9fa1fa
rocksdb callbacks, missing symbol fixes
Richard Westhaver <ellis@rwest.io>
parents:
437
diff
changeset
|
66 | `(let (%a %p) |
291 | 67 | (setq |
594
5bd0eb9fa1fa
rocksdb callbacks, missing symbol fixes
Richard Westhaver <ellis@rwest.io>
parents:
437
diff
changeset
|
68 | %a (lambda ,largs ,@body) |
5bd0eb9fa1fa
rocksdb callbacks, missing symbol fixes
Richard Westhaver <ellis@rwest.io>
parents:
437
diff
changeset
|
69 | %p (dlambda |
291 | 70 | (:pandoric-get (sym) |
71 | ,(pandoriclet-get pargs)) |
|
72 | (:pandoric-set (sym val) |
|
73 | ,(pandoriclet-set pargs)) |
|
74 | (t (&rest args) |
|
594
5bd0eb9fa1fa
rocksdb callbacks, missing symbol fixes
Richard Westhaver <ellis@rwest.io>
parents:
437
diff
changeset
|
75 | (apply %a args))))))) |
291 | 76 | |
77 | (defvar pandoric-eval-tunnel) |
|
78 | ||
79 | (defmacro pandoric-eval (vars expr) |
|
80 | `(let ((pandoric-eval-tunnel |
|
81 | (plambda () ,vars t))) |
|
82 | (eval `(with-pandoric |
|
83 | ,',vars pandoric-eval-tunnel |
|
84 | ,,expr)))) |