diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-05-22 07:23:47 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-05-22 07:23:47 -0700 |
commit | 43b371fa552149ad237fec114af4f4feb65fa5bf (patch) | |
tree | 1dbcec6355bbadb7527e9786f06289fc2f924baf /place.tl | |
parent | 22e6568de7fe351974057e57d17078fd8f2b442b (diff) | |
download | txr-43b371fa552149ad237fec114af4f4feb65fa5bf.tar.gz txr-43b371fa552149ad237fec114af4f4feb65fa5bf.tar.bz2 txr-43b371fa552149ad237fec114af4f4feb65fa5bf.zip |
Adding pushnew.
* place.tl (pushnew): New macro.
* lisplib.c (set_place_dlt_entries): Add pushnew.
Diffstat (limited to 'place.tl')
-rw-r--r-- | place.tl | 12 |
1 files changed, 12 insertions, 0 deletions
@@ -225,6 +225,18 @@ ^(let ((,tmp (,getter))) (prog1 (car ,tmp) (,setter (cdr ,tmp))))))) + (defmacro pushnew (new-item place :env env : + (testfun :) + (keyfun :)) + (with-update-expander (getter setter) place env + (with-gensyms (new-item-sym old-list-sym) + ^(let ((,new-item-sym ,new-item)) + ,(with-update-expander (getter setter) place env + ^(let ((,old-list-sym (,getter))) + (if (member ,new-item-sym ,old-list-sym ,testfun ,keyfun) + ,old-list-sym + (,setter (cons ,new-item-sym ,old-list-sym))))))))) + (defmacro shift (:env env . places) (tree-case places (() (sys:eval-err "shift: need at least two arguments")) |