;; .elkrc - elk user startup file

(display "loading .elkrc") (newline)
;;(set! load-noisily? #t)
;;(foreign-trace! #t)

(define (fflush) (flush-output-port (current-output-port)))

(define $HOME (os-getenv "HOME"))

;; cause default macros to be loaded, so we can redefine when
(when #f)

;; int/real conversion is likely source of trouble in porting to/from lisp
(define tofloat float)
(define toint truncate)

(define (assert x) (if (not x) (error 'assert "failed")))

; vector compiler
(autoload 'parlet 'parlet.e)

;; synonyms
(define gc collect)

;; elk does not seem to expand macros at read time.  use mdefine to do this.
;; mdefine generally DOES NOT WORK within an eval!
(define-macro (mdefine binding . body)
;    (print body)
 `(define ,binding ,@(expand body)))


;; syntax

(define nil '())

;; was defined as (and ,@body) in elk 
(define-macro (when test . body)
  `(if ,test (begin ,@body)))

;; note dolist must return nil
(define-macro (dolist iter . body)
  `(for-each (lambda (,(car iter)) ,@body) ,@(cdr iter)))

;; (dofarray (i el arr) ... )
;;tst: (define ft '(dofarray (i e x) (print e)))
(define-macro (dofarray iter . body)
  `(let ((len (farray-length ,@(cddr iter))))
     (dotimes (,(car iter) len)
       (let ((,(cadr iter) (farray-ref ,@(cddr iter) ,(car iter))))
	 ,@body))))

(define-macro (dotimes iter . body )
  `(do ((,(car iter) 0 (1+ ,(car iter))))
       ((= ,(car iter) ,(cadr iter)))
       ,@body)
)

(define-macro (for var start stop . body)
  `(do ((,var ,start (1+ ,var))) ((> ,var ,stop)) ,@body))

(define-macro (pop li el)
  `(begin (set! ,el (car ,li))  (set! ,li (cdr ,li)) nil))


(define top-dir (os-pathgetpath (caddr load-path)))

;; add a scheme library directory 
(set! load-path (append '("/usr/local/pub/lib/elk") load-path))

;; ad a user scheme directory
(set! load-path
      (cons (string-append $HOME "/scheme") load-path))

;(if (equal? (os-architecture) "mips") ...)
