diff options
-rw-r--r-- | autoload.c | 2 | ||||
-rw-r--r-- | stdlib/place.tl | 8 | ||||
-rw-r--r-- | txr.1 | 24 |
3 files changed, 33 insertions, 1 deletions
@@ -101,7 +101,7 @@ static val place_set_entries(val fun) lit("with-update-expander"), lit("with-clobber-expander"), lit("with-delete-expander"), lit("set"), lit("pset"), lit("zap"), lit("flip"), lit("inc"), lit("dec"), - lit("pinc"), lit("pdec"), + lit("pinc"), lit("pdec"), lit("mul"), lit("div"), lit("set-mask"), lit("clear-mask"), lit("push"), lit("pop"), lit("swap"), lit("shift"), lit("rotate"), lit("test-set"), lit("test-clear"), lit("compare-swap"), diff --git a/stdlib/place.tl b/stdlib/place.tl index 993dd75c..cd6cbd9d 100644 --- a/stdlib/place.tl +++ b/stdlib/place.tl @@ -283,6 +283,14 @@ (with-update-expander (getter setter) place env ^(,setter (logand (,getter) (lognot (logior ,*integers)))))) +(defmacro mul (place factor :env env) + (with-update-expander (getter setter) place env + ^(,setter (* (,getter) ,factor)))) + +(defmacro div (place factor :env env) + (with-update-expander (getter setter) place env + ^(,setter (/ (,getter) ,factor)))) + (defmacro swap (place-0 place-1 :env env) (with-gensyms (tmp) (with-update-expander (getter-0 setter-0) place-0 env @@ -44944,6 +44944,30 @@ then is returned, otherwise .codn nil . +.coNP Macros @ mul and @ div +.synb +.mets (mul << place < factor ) +.mets (div << place < factor ) +.syne +.desc +The +.code mul +and +.code div +macros update +.meta place +by scaling its value by +.metn factor . + +The following equivalences hold, except that the operand +.code x +is evaluated only once: + +.verb + (mul x y) <--> (set x (* x y)) + (div x y) <--> (set x (/ x y)) +.brev + .coNP Macro @ swap .synb .mets (swap < left-place << right-place ) |