diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-05-13 19:55:03 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-05-13 19:55:03 -0700 |
commit | 305c3638096b12715ee37904fc46f37b7fa0baa6 (patch) | |
tree | 7079e4152c8f485238a5102862cf06ce7b425650 | |
parent | 4108b7cb7a569600c9d17c5116be74e2ecf4b3e1 (diff) | |
download | txr-305c3638096b12715ee37904fc46f37b7fa0baa6.tar.gz txr-305c3638096b12715ee37904fc46f37b7fa0baa6.tar.bz2 txr-305c3638096b12715ee37904fc46f37b7fa0baa6.zip |
* place.tl (define-modify-macro): New macro.
* lisplib.c (set_place_dlt_entries): Add define-modify-macro.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | lisplib.c | 1 | ||||
-rw-r--r-- | place.tl | 10 |
3 files changed, 16 insertions, 1 deletions
@@ -1,5 +1,11 @@ 2015-05-13 Kaz Kylheku <kaz@kylheku.com> + * place.tl (define-modify-macro): New macro. + + * lisplib.c (set_place_dlt_entries): Add define-modify-macro. + +2015-05-13 Kaz Kylheku <kaz@kylheku.com> + * place.tl (push): Ensure left-to-right eval order. 2015-05-12 Kaz Kylheku <kaz@kylheku.com> @@ -56,6 +56,7 @@ static void set_place_dlt_entries(val dlt, val fun) lit("set"), lit("pset"), lit("zap"), lit("flip"), lit("inc"), lit("dec"), lit("push"), lit("pop"), lit("swap"), lit("shift"), lit("rotate"), lit("del"), + lit("define-modify-macro"), nil }; @@ -475,4 +475,12 @@ (each ((table (list *place-update-expander* *place-clobber-expander* *place-delete-expander*))) - (set [table to] [table from]))))) + (set [table to] [table from])))) + + (defmacro define-modify-macro (name lambda-list function) + (let ((cleaned-lambda-list (mapcar [iffi consp car] + (remql : lambda-list)))) + (with-gensyms (place-sym args-sym) + ^(defmacro ,name (:env env ,place-sym ,*lambda-list) + (with-update-expander (getter setter) ,place-sym env + ^(,setter (,',function (,getter) ,,*cleaned-lambda-list)))))))) |