summary refs log blame commit diff stats
path: root/cl-math.lisp
blob: 61a8e2693e321ff43da8a74018a7c313e52584c0 (plain) (tree)






























































                                                                                                                                                                   
                             





























                                                                                                                     
;;; plus one function
;;; it is the (next-number) and the (next-number-reversed)

(defun next-digit (numerals digit)
  "Given a list of a numeral system and a digit, it returns the next digit."
  (cond
    ((eql (car (last numerals)) digit) (car numerals))
    ((not (eql (car numerals) digit)) (next-digit (cdr numerals) digit))
    (t (cadr numerals))))

(defun split-number-reversed (number)
  "Given a number, it returns a list of the number in reverse (because the decimal number system a reversed number system)."
  (cond
    ((zerop number) nil)
    (t (cons (mod number 10) (split-number-reversed (truncate number 10))))))

(defun next-list-number (numerals number-list-reversed)
  "Given a list of a numeral system and a list of a number, it returns a list of the next number."
  (cond
    ((null number-list-reversed)
     (cons (if (zerop (car numerals))
	       (cadr numerals)
	       (car numerals)) nil))
    ((eql (car number-list-reversed) (car (last numerals)))
     (cons (car numerals) (next-list-number numerals (cdr number-list-reversed))))
    (t (cons (next-digit numerals (car number-list-reversed)) (cdr number-list-reversed)))))

(defun next-number (numerals number)
  "Given a list of a numeral system and a number, it returns the list of the next number."
  (reverse (next-list-number numerals (split-number-reversed number))))

(defun next-number-reversed (numerals number)
  "Given a list of a numeral system and a number, it returns the reversed list of the next number (returns list, because the interpreter cuts zero's on the left)."
  (next-list-number numerals (reverse (split-number-reversed number))))

(defun previous-digit (numerals digit)
  "Given a list of a numeral system and a digit, it returns the previous digit."
  (next-digit (reverse numerals) digit))

(defun previous-list-number (numerals number-list-reversed)
  "Given a list of a numeral system and a list of a number, it returns a list of the previous number."
  (cond
    ((and
      (null (cdr number-list-reversed))
      (eql (car number-list-reversed)
	   (if (zerop (car numerals))
	       (cadr numerals)
	       (car numerals))))
     nil)
    ((and
      (eql (car number-list-reversed) (car numerals))
      (not (null (cdr number-list-reversed))))
     (cons (previous-digit numerals (car number-list-reversed)) (previous-list-number numerals (cdr number-list-reversed))))
    (t (cons (previous-digit numerals (car number-list-reversed)) (cdr number-list-reversed)))))

(defun previous-number (numerals number)
  "Given a list of a numeral system and a number, it returns the list of the previous number."
  (reverse (previous-list-number numerals (split-number-reversed number))))

(defun plus-args-list (numerals a-reversed b-reversed)
  "Given a list of a numeral system and two lists of numbers, it returns the list of it's sum."
  (cond
    ((and
      (null (cdr b-reversed))
      (eql (car b-reversed) (if (zerop (car numerals))
				(cadr numerals)
				(car numerals))))
     (next-list-number numerals a-reversed))
    (t (plus-args-list numerals (next-list-number numerals a-reversed) (previous-list-number numerals b-reversed)))))

(defun plus (numerals a b)
  "Given a list of a numeral system and two numbers, it returns the list of it's sum."
  (reverse (plus-args-list numerals (split-number-reversed a) (split-number-reversed b))))

;; (defun next-number (numerals number)
;;   "Given a list of a numeral system and a number, it returns the next number."
;;   (reduce (lambda (a b) (+ (* b 10) a))
;; 	  (next-list-number numerals (split-number-reversed number))
;; 	  :initial-value 0
;; 	  :from-end t))

(defun plus-number (numerals number1 number2)
  "Given a list of a numeral system and 2 numbers, it returns it's sum."
  (reduce (lambda (a b) (+ (* a 10) b))
	  (plus numerals number1 number2)
	  :initial-value 0))

(defun plus-decimal (a b)
  "Given 2 decimal numbers, it returns it's sum."
  (plus-number '(0 1 2 3 4 5 6 7 8 9) a b))

(defun plus-earth (a b)
  "Give 2 earthal numbers, it returns it's sum."
  (plus-number '(1 2 3 4 5) a b))