summaryrefslogtreecommitdiffstats
path: root/stdlib/place.tl
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/place.tl')
-rw-r--r--stdlib/place.tl11
1 files changed, 11 insertions, 0 deletions
diff --git a/stdlib/place.tl b/stdlib/place.tl
index 1eb42b56..a08e320a 100644
--- a/stdlib/place.tl
+++ b/stdlib/place.tl
@@ -862,6 +862,17 @@
^(macrolet ((,ssetter (val) ^(slotset ,',struct ,',sym ,val)))
,body)))
+(defun read-once (value) value)
+
+(defplace (read-once place) body
+ (getter setter
+ (with-gensyms (cache-var pgetter psetter)
+ (with-update-expander (pgetter psetter) place sys:*pl-env*
+ ^(slet ((,cache-var (,pgetter)))
+ (macrolet ((,getter () ',cache-var)
+ (,setter (val) ^(,',psetter (set ,',cache-var ,val))))
+ ,body))))))
+
(defmacro define-modify-macro (name lambda-list function)
(let ((cleaned-lambda-list (mapcar [iffi consp car]
(remql : lambda-list))))