a38b4e8e05d67c8506c1958a855d4cef5fdbba6b
[clinton/parenscript.git] / src / lib / ps-macro-lib.lisp
1 (in-package :parenscript)
2
3 ;;; Handy utilities for doing common tasks found in many web browser
4 ;;; JavaScript implementations
5
6 (defpsmacro do-set-timeout ((timeout) &body body)
7 `(set-timeout (lambda () ,@body) ,timeout))
8
9 ;;; Arithmetic
10
11 (defmacro def-js-maths (&rest mathdefs)
12 `(progn ,@(mapcar (lambda (def) (cons 'defpsmacro def)) mathdefs)))
13
14 (def-js-maths
15 (max (&rest nums) `(*math.max ,@nums))
16 (min (&rest nums) `(*math.min ,@nums))
17 (floor (n &optional divisor) `(*math.floor ,(if divisor `(/ ,n ,divisor) n)))
18 (ceiling (n &optional divisor) `(*math.ceil ,(if divisor `(/ ,n ,divisor) n)))
19 (round (n &optional divisor) `(*math.round ,(if divisor `(/ ,n ,divisor) n)))
20 (sin (n) `(*math.sin ,n))
21 (cos (n) `(*math.cos ,n))
22 (tan (n) `(*math.tan ,n))
23 (asin (n) `(*math.asin ,n))
24 (acos (n) `(*math.acos ,n))
25 (atan (y &optional x) (if x `(*math.atan2 ,y ,x) `(*math.atan ,y)))
26 (sinh (n) `((lambda (x) (return (/ (- (exp x) (exp (- x))) 2))) ,n))
27 (cosh (n) `((lambda (x) (return (/ (+ (exp x) (exp (- x))) 2))) ,n))
28 (tanh (n) `((lambda (x) (return (/ (- (exp x) (exp (- x))) (+ (exp x) (exp (- x)))))) ,n))
29 (asinh (n) `((lambda (x) (return (log (+ x (sqrt (1+ (* x x))))))) ,n))
30 (acosh (n) `((lambda (x) (return (* 2 (log (+ (sqrt (/ (1+ x) 2)) (sqrt (/ (1- x) 2))))))) ,n))
31 (atanh (n) `((lambda (x) (return (/ (- (log (+ 1 x)) (log (- 1 x))) 2))) ,n))
32 (1+ (n) `(+ ,n 1))
33 (1- (n) `(- ,n 1))
34 (abs (n) `(*math.abs ,n))
35 (evenp (n) `(not (oddp ,n)))
36 (oddp (n) `(% ,n 2))
37 (exp (n) `(*math.exp ,n))
38 (expt (base power) `(*math.pow ,base ,power))
39 (log (n &optional base)
40 (or (and (null base) `(*math.log ,n))
41 (and (numberp base) (= base 10) `(* (log ,n) *math.*log10e*))
42 `(/ (log ,n) (log ,base))))
43 (sqrt (n) `(*math.sqrt ,n))
44 (random (&optional upto) (if upto
45 `(floor (* ,upto (*math.random)))
46 '(*math.random))))
47
48 ;;; Exception handling
49
50 (defpsmacro ignore-errors (&body body)
51 `(try (progn ,@body) (:catch (e))))
52
53 ;;; Data structures
54
55 (defpsmacro length (a)
56 `(.size ,a))
57
58 ;;; Misc
59
60 (defpsmacro null (x)
61 `(= ,x nil))
62
63 (defpsmacro @ (obj &rest props)
64 "Handy slot-value/aref composition macro."
65 (if (null props)
66 obj
67 `(@ (slot-value
68 ,(if (stringp obj) `($ ,obj) obj)
69 ,(let ((prop (macroexpand (first props))))
70 (if (symbolp prop)
71 `',prop
72 prop)))
73 ,@(cdr props))))
74
75 (defpsmacro concatenate (result-type &rest sequences)
76 (assert (equal result-type ''string) () "Right now Parenscript 'concatenate' only support strings.")
77 (cons '+ sequences))