egison-3.2.8: lib/core/number.egi
;;;;;
;;;;;
;;;;; Number Library
;;;;;
;;;;;
;;;
;;; Integers
;;;
(define $integer
(matcher
{[,$n []
{[$tgt (if (eq? tgt n)
{[]}
{})]}]
[$ [something]
{[$tgt {tgt}]}]
}))
(define $compare-integer
(lambda [$m $n]
(if (lt? m n)
<Less>
(if (eq? m n)
<Equal>
<Greater>))))
(define $min
(lambda [$ns]
(match ns (list integer)
{[<cons $n <nil>> n]
[<cons $n $rs>
(let {[$r (min rs)]}
(match (compare-integer n r) ordering
{[<less> n]
[_ r]}))]})))
(define $max
(lambda [$ns]
(match ns (list integer)
{[<cons $n <nil>> n]
[<cons $n $rs>
(let {[$r (max rs)]}
(match (compare-integer n r) ordering
{[<greater> n]
[_ r]}))]})))
(define $min-and-max
(lambda [$ns]
(match ns (list integer)
{[<cons $n <nil>> [n n]]
[<cons $n $rs>
(let {[[$min-n $max-n] (min-and-max rs)]}
(match (compare-integer n min-n) ordering
{[<less> [n max-n]]
[_ (match (compare-integer n max-n) ordering
{[<greater> [min-n n]]
[_ [min-n max-n]]})]}))]})))
(define $power
(lambda [$x $n]
(foldl * 1 (take n (repeat1 x)))))
(define $mod
(lambda [$m]
(matcher
{[,$n []
{[$tgt (if (eq? (modulo tgt m) (modulo n m))
{[]}
{})]}]
[$ [something]
{[$tgt {(modulo tgt m)}]}]
})))
;;
;; Float Numbers
;;
(define $float
(matcher
{[,$d []
{[$tgt (if (eq? tgt d) {[]} {})]}]
[$ [something]
{[$tgt {tgt}]}]
}))
(define $compare-float
(lambda [$d1 $d2]
(if (lt? d1 d2)
<Less>
(if (eq? d1 d2)
<Equal>
<Greater>))))