diff options
-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)))))))) |