diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-07-22 20:41:54 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-07-22 20:41:54 -0700 |
commit | d6760da67732419d8043d1fdc43e8081f96ef1f1 (patch) | |
tree | 021b792bbba89c65d5fbfeaa9132f6325988d11b /share | |
parent | 0dd87c5b673f94f06263ace234e689e953bf3393 (diff) | |
download | txr-d6760da67732419d8043d1fdc43e8081f96ef1f1.tar.gz txr-d6760da67732419d8043d1fdc43e8081f96ef1f1.tar.bz2 txr-d6760da67732419d8043d1fdc43e8081f96ef1f1.zip |
Adding nthcdr as accessor.
* eval.c (eval_init): Register nthcdr function.
* lib.c (nthcdr): New function.
* lib.h (nthcdr): Declared.
* share/txr/stdlib/place.tl (nthcdr): New defplace.
* txr.1: Documented.
Diffstat (limited to 'share')
-rw-r--r-- | share/txr/stdlib/place.tl | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/share/txr/stdlib/place.tl b/share/txr/stdlib/place.tl index e19caa2f..f086ce31 100644 --- a/share/txr/stdlib/place.tl +++ b/share/txr/stdlib/place.tl @@ -355,6 +355,26 @@ (prog1 (cdr ,tmp) (,csetter (car ,tmp)))))))) ,body))) +(defplace (nthcdr index list) body + (getter setter + (with-gensyms (index-sym sentinel-head-sym parent-cell-sym) + (if (place-form-p list) + (with-update-expander (lgetter lsetter) list nil + ^(rlet ((,index-sym ,index)) + (let* ((,sentinel-head-sym (cons nil (,lgetter))) + (,parent-cell-sym (nthcdr ,index-sym ,sentinel-head-sym))) + (macrolet ((,getter () ^(cdr ,',parent-cell-sym)) + (,setter (val) + ^(progn (sys:rplacd ,',parent-cell-sym ,val) + (,',lsetter (cdr ,',sentinel-head-sym))))) + ,body)))) + ^(rlet ((,index-sym ,index)) + (let* ((,parent-cell-sym (nthcdr (pred ,index-sym) ,list))) + (macrolet ((,getter () ^(cdr ,',parent-cell-sym)) + (,setter (val) + ^(sys:rplacd ,',parent-cell-sym ,val))) + ,body))))))) + (defplace (vecref vector index :whole args) body (getter setter (with-gensyms (vec-sym ind-sym) |