8e950d7312af

Fix modify macros to comply with the spec

They happened to work in SBCL before, but according to the spec
`define-modify-macro` takes only a symbol as the function argument,
not a lambda or anything else.
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Sat, 20 Aug 2016 21:03:44 +0000
parents 70f3c369fedb
children e21b181efc55
branches/tags (none)
files losh.lisp

Changes

--- a/losh.lisp	Sat Aug 20 13:25:22 2016 +0000
+++ b/losh.lisp	Sat Aug 20 21:03:44 2016 +0000
@@ -280,17 +280,20 @@
 (define-modify-macro mulf (factor) *
   "Multiply `place` by `factor` in-place.")
 
-(define-modify-macro divf (&optional divisor)
-  (lambda (value divisor)
-    (if divisor
-      (/ value divisor)
-      (/ value)))
+
+(defun %divf (value &optional divisor)
+  (if divisor
+    (/ value divisor)
+    (/ value)))
+
+(define-modify-macro divf (&optional divisor) %divf
   "Divide `place` by `divisor` in-place.
 
   If `divisor` is not given, `place` will be set to `(/ 1 place)`.
 
   ")
 
+
 (define-modify-macro modf (divisor) mod
   "Modulo `place` by `divisor` in-place.")
 
@@ -304,11 +307,13 @@
   "Negate the value of `place`.")
 
 
-(define-modify-macro %callf (function)
-  (lambda (value function)
-    (funcall function value))
+(defun %funcall (value function)
+  (funcall function value))
+
+(define-modify-macro %callf (function) %funcall
   "Set `place` to the result of calling `function` on its current value.")
 
+
 (defmacro callf (&rest place-function-pairs)
   "Set each `place` to the result of calling `function` on its current value.