;; init.lsp -- init XLisp global environment
;;

(defun require (package)
  (unless (get package 'provided)
	  (or (load (concatenate 'string (string-downcase package) ".ol"))
	      (load (concatenate 'string (string-downcase package) ".l"))
	      (load (concatenate 'string (string-downcase package) ".lsp"))
	      (error "can't load package" package))
	  ) )

(defun provide (package)
  (setf (get package 'provided) t)
  )


; from 2.1almy...
; initialization file for XLISP 2.0

(unless (fboundp 'strcat) ; backwards compatibility if COMMONLISP defined
	(defmacro strcat (&rest str) `(concatenate 'string ,@str)))


; define some macros
(defmacro defvar (sym &optional val)
  `(if (boundp ',sym) ,sym (setq ,sym ,val)))
(defmacro defparameter (sym val)
  `(setq ,sym ,val))
(defmacro defconstant (sym val)
  `(setq ,sym ,val))

; (makunbound sym) - make a symbol value be unbound
(defun makunbound (sym) (setf (symbol-value sym) '*unbound*) sym)

; (fmakunbound sym) - make a symbol function be unbound
(defun fmakunbound (sym) (setf (symbol-function sym) '*unbound*) sym)

; (mapcan fun list [ list ]...)
(defmacro mapcan (&rest args) `(apply #'nconc (mapcar ,@args)))

; (mapcon fun list [ list ]...)
(defmacro mapcon (&rest args) `(apply #'nconc (maplist ,@args)))

; initialize to enable breaks and trace back
(setq *breakenable* t)
(setq *tracenable* nil)
(alloc 50000)
