diff options
Diffstat (limited to 'stdlib')
-rw-r--r-- | stdlib/doc-syms.tl | 1 | ||||
-rw-r--r-- | stdlib/place.tl | 11 |
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)))) |