; Standard library
(define (abs n)
	(if (real? n)
		(if (>= n 0) n (- n))
		(magnitude n)))
(define (expt b n)
  (define (iex k) 
	(cond ((eq? k 0) 1)
	  ((odd? k) (* b (iex (- k 1))))
	  (else (let ((h (iex (/ k 2))))
		 	(* h h)))))	
  (if (and (integer? n) (>= n 0))
	(iex n) (exp (* n (log b)))))
(define (for-each f l)
	(if (null? l) #n
	(begin (f (car l))
		 (for-each f (cdr l)))))
(define (input prompt)
  (string->object 
    (input-string prompt)))
(define (input-string prompt)
  (frm-popup 9993 (lambda (e . a)
    (case e
      ((frm-open) 
	(fld-set-text 9301 prompt)
	(frm-set-focus 9302))
      ((ctl-select)
	(case (car a)
	  ((9303) (frm-return 
		(fld-get-text 9302)))
	  ((9304) 
		(error "Interrupted"))))
      (else #f)))))
(define (map f l)
  (letrec ((result (cons '() '()))
	(helper (lambda (p l)
	  (cond ((null? l)  p)
	    (else (set-cdr! p
			(cons (f (car l)) '()))
		(helper (cdr p) (cdr l)))))))
	(helper result l)
	(cdr result)))
(define (max n . l)
	(if (null? l) n
	  (let ((m (apply max l)))
	    (if (<= n m) m n))))
(define (min n . l)
	(if (null? l) n
	  (let ((m (apply min l)))
	    (if (<= n m) n m))))
(define (modulo a b)
  (let ((r (remainder a b)))
    (if (or (eqv? r 0) 
	(eq? (> r 0) (> b 0)))
	 	r (+ r b))))
(define (negative? x) (< x 0))
(define (port? p) (or (input-port? p)
	(output-port? p)))
(define (positive? x) (> x 0))
(define (wait-pen)
  (let ((e (event #t)))
    (if (and (pair? e) 
		(eq? (car e) 'pen-down))
	(cons (cadr e) (caddr e))
	(wait-pen))))
(define (zero? x) (eqv? x 0))
