summaryrefslogtreecommitdiffstats
path: root/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/doc-syms.tl1
-rw-r--r--stdlib/place.tl11
2 files changed, 12 insertions, 0 deletions
diff --git a/stdlib/doc-syms.tl b/stdlib/doc-syms.tl
index 38f5dc7b..7df26d2e 100644
--- a/stdlib/doc-syms.tl
+++ b/stdlib/doc-syms.tl
@@ -1544,6 +1544,7 @@
("rcomb" "N-02D9003C")
("rcons" "N-02E9003D")
("read" "N-03FE5500")
+ ("read-once" "N-010F1250")
("read-until-match" "N-001D3F81")
("readdir" "N-0289D074")
("readlink" "N-0338B219")
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))))