a38b4e8e05d67c8506c1958a855d4cef5fdbba6b
1 (in-package :parenscript
)
3 ;;; Handy utilities for doing common tasks found in many web browser
4 ;;; JavaScript implementations
6 (defpsmacro do-set-timeout
((timeout) &body body
)
7 `(set-timeout (lambda () ,@body
) ,timeout
))
11 (defmacro def-js-maths
(&rest mathdefs
)
12 `(progn ,@(mapcar (lambda (def) (cons 'defpsmacro def
)) mathdefs
)))
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
))
34 (abs (n) `(*math.abs
,n
))
35 (evenp (n) `(not (oddp ,n
)))
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
)))
48 ;;; Exception handling
50 (defpsmacro ignore-errors
(&body body
)
51 `(try (progn ,@body
) (:catch
(e))))
55 (defpsmacro length
(a)
63 (defpsmacro @ (obj &rest props
)
64 "Handy slot-value/aref composition macro."
68 ,(if (stringp obj
) `($
,obj
) obj
)
69 ,(let ((prop (macroexpand (first props
))))
75 (defpsmacro concatenate
(result-type &rest sequences
)
76 (assert (equal result-type
''string
) () "Right now Parenscript 'concatenate' only support strings.")