From f0a0a7b2efe5eddd1a3da9f2cfea15a2467a1621 Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20V=C3=A1zquez?= Date: Sat, 15 Jun 2013 18:32:58 +0200 Subject: [PATCH] Use macrolet to implemnt arithmetic helper macros --- src/numbers.lisp | 71 +++++++++++++++++++++++++----------------------------- 1 file changed, 33 insertions(+), 38 deletions(-) diff --git a/src/numbers.lisp b/src/numbers.lisp index 18d679c..56328c8 100644 --- a/src/numbers.lisp +++ b/src/numbers.lisp @@ -15,33 +15,30 @@ ;;;; Various numeric functions and constants -;; TODO: Use MACROLET when it exists -(defmacro define-variadic-op (operator initial-value) - (let ((init-sym (gensym)) - (dolist-sym (gensym))) - `(defun ,operator (&rest args) - (let ((,init-sym ,initial-value)) - (dolist (,dolist-sym args) - (setq ,init-sym (,operator ,init-sym ,dolist-sym))) - ,init-sym)))) - -(define-variadic-op + 0) -(define-variadic-op * 1) +(macrolet ((def (operator initial-value) + (let ((init-sym (gensym)) + (dolist-sym (gensym))) + `(defun ,operator (&rest args) + (let ((,init-sym ,initial-value)) + (dolist (,dolist-sym args) + (setq ,init-sym (,operator ,init-sym ,dolist-sym))) + ,init-sym))))) + (def + 0) + (def * 1)) ;; - and / work differently from the above macro. ;; If only one arg is given, it negates it or takes its reciprocal. ;; Otherwise all the other args are subtracted from or divided by it. -;; TODO: Use MACROLET when it exists -(defmacro define-sub-or-div (operator unary-form) - `(defun ,operator (x &rest args) - (cond - ((null args) ,unary-form) - (t (dolist (y args) - (setq x (,operator x y))) - x)))) - -(define-sub-or-div - (- x)) -(define-sub-or-div / (/ 1 x)) +(macrolet ((def (operator unary-form) + `(defun ,operator (x &rest args) + (cond + ((null args) ,unary-form) + (t (dolist (y args) + (setq x (,operator x y))) + x))))) + (def - (- x)) + (def / (/ 1 x))) + (defun 1+ (x) (+ x 1)) (defun 1- (x) (- x 1)) @@ -59,21 +56,19 @@ (defun zerop (x) (= x 0)) (defun plusp (x) (< 0 x)) -;; TODO: Use MACROLET when it exists -(defmacro defcomparison (operator) - `(defun ,operator (x &rest args) - (dolist (y args) - (if (,operator x y) - (setq x (car args)) - (return-from ,operator nil))) - t)) - -(defcomparison >) -(defcomparison >=) -(defcomparison =) -(defcomparison <) -(defcomparison <=) -(defcomparison /=) +(macrolet ((def (operator) + `(defun ,operator (x &rest args) + (dolist (y args) + (if (,operator x y) + (setq x (car args)) + (return-from ,operator nil))) + t))) + (def >) + (def >=) + (def =) + (def <) + (def <=) + (def /=)) (defconstant pi 3.141592653589793) -- 1.7.10.4