summaryrefslogtreecommitdiff
path: root/numbers.lisp
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <matthias@benkard.de>2008-08-07 14:57:27 +0200
committerMatthias Andreas Benkard <matthias@benkard.de>2008-08-07 14:57:27 +0200
commit1b556d9e057c6e3bed4893036d12eed1f3bc238d (patch)
tree51193cf4a28ea955967b3e9440b6508a17cb0d1c /numbers.lisp
parenta35098ffebf51958f22e0845b5b6803c0dff1dfb (diff)
Add various array operations.
Diffstat (limited to 'numbers.lisp')
-rw-r--r--numbers.lisp54
1 files changed, 53 insertions, 1 deletions
diff --git a/numbers.lisp b/numbers.lisp
index 607ccab..af58878 100644
--- a/numbers.lisp
+++ b/numbers.lisp
@@ -18,7 +18,7 @@
(in-package #:common-lisp)
-(export '(1+ 1- =))
+(export '(1+ 1- = mod evenp oddp zerop + - *))
(defun 1+ (n)
@@ -39,3 +39,55 @@
(integer (etypecase y
(fixnum nil)
(integer (%= x y))))))
+
+(defun + (x y)
+ (etypecase x
+ (fixnum (etypecase y
+ (fixnum (add-fixnums x y))
+ (integer (send-by-name x "add:" y))))
+ (integer (etypecase y
+ (integer (send-by-name x "add:" y))))))
+
+(defun - (x y)
+ (etypecase x
+ (fixnum (etypecase y
+ (fixnum (subtract-fixnums x y))
+ (integer (send-by-name x "subtract:" y))))
+ (integer (etypecase y
+ (integer (send-by-name x "subtract:" y))))))
+
+(defun * (x y)
+ (etypecase x
+ (fixnum (etypecase y
+ (fixnum (multiply-fixnums x y))
+ (integer (send-by-name x "multiplyWith:" y))))
+ (integer (etypecase y
+ (integer (send-by-name x "multiplyWith:" y))))))
+
+(defun idiv (x y)
+ (etypecase x
+ (fixnum (etypecase y
+ (fixnum (idivide-fixnums x y))
+ (integer (send-by-name x "divideBy:" y))))
+ (integer (etypecase y
+ (integer (send-by-name x "divideBy:" y))))))
+
+(defun mod (n m)
+;; (if (and (typep n 'fixnum)
+;; (typep m 'fixnum))
+;; (fixnum-mod n m)
+;; (send-by-name n "mod:" m))
+ (send-by-name n "mod:" m))
+
+
+(defun evenp (n)
+ (etypecase n
+ (fixnum (zerop (mod n 2)))
+ (integer (send-by-name n "evenp"))))
+
+(defun oddp (n)
+ (not (evenp n)))
+
+(defun zerop (n)
+ (etypecase n
+ (integer (%zerop n))))