when (plusp (length compilation))
do (write-string compilation out)))))
+(defun dump-global-environment (stream)
+ (flet ((late-compile (form)
+ (write-string (ls-compile-toplevel form) stream)))
+ ;; Set the initial global environment to be equal to the host global
+ ;; environment at this point of the compilation.
+ (late-compile `(setq *environment* ',*environment*))
+ ;; Set some counter variable properly, so user compiled code will
+ ;; not collide with the compiler itself.
+ (late-compile
+ `(progn
+ ,@(mapcar (lambda (s) `(%intern-symbol (%js-vref ,(cdr s)))) *literal-table*)
+ (setq *literal-table* ',*literal-table*)
+ (setq *variable-counter* ,*variable-counter*)
+ (setq *gensym-counter* ,*gensym-counter*)))
+ (late-compile `(setq *literal-counter* ,*literal-counter*))))
+
(defun bootstrap ()
(setq *environment* (make-lexenv))
(setq *literal-table* nil)
(write-string (read-whole-file (source-pathname "prelude.js")) out)
(dolist (input *source*)
(when (member (cadr input) '(:target :both))
- (ls-compile-file (source-pathname (car input) :type "lisp") out))))
+ (ls-compile-file (source-pathname (car input) :type "lisp") out)))
+ (dump-global-environment out))
;; Tests
(with-open-file (out "tests.js" :direction :output :if-exists :supersede)
(dolist (input (append (directory "tests.lisp")
(setq *package* *user-package*)
+;;; Set some external entry point to the Lisp implementation to the
+;;; console. It would not be necessary when FFI is finished.
(js-eval "var lisp")
(%js-vset "lisp" (new))
(%js-vset "lisp.read" #'ls-read-from-string)
(%js-vset "lisp.evalString" (lambda (str) (eval (ls-read-from-string str))))
(%js-vset "lisp.evalInput" (lambda (str) (eval-interactive (ls-read-from-string str))))
(%js-vset "lisp.compileString" (lambda (str) (ls-compile-toplevel (ls-read-from-string str) t)))
-
-;; Set the initial global environment to be equal to the host global
-;; environment at this point of the compilation.
-(eval-when-compile
- (toplevel-compilation
- (ls-compile `(setq *environment* ',*environment*))))
-
-(eval-when-compile
- (toplevel-compilation
- (ls-compile
- `(progn
- ,@(mapcar (lambda (s) `(%intern-symbol (%js-vref ,(cdr s))))
- *literal-table*)
- (setq *literal-table* ',*literal-table*)
- (setq *variable-counter* ,*variable-counter*)
- (setq *gensym-counter* ,*gensym-counter*)))))
-
-(eval-when-compile
- (toplevel-compilation
- (ls-compile
- `(setq *literal-counter* ,*literal-counter*))))