From f92bc46ea965b290b67119e0dd076bd8ad0d1b46 Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20V=C3=A1zquez?= Date: Wed, 19 Feb 2014 02:48:57 +0100 Subject: [PATCH] Rewrite the REPL in Lisp using FFI --- jscl.html | 48 ++------------------------------------------ src/compiler/compiler.lisp | 3 --- src/stream.lisp | 3 +++ src/toplevel.lisp | 41 ++++++++++++++++++++++++++++--------- 4 files changed, 36 insertions(+), 59 deletions(-) diff --git a/jscl.html b/jscl.html index ade16ec..a8d109b 100644 --- a/jscl.html +++ b/jscl.html @@ -62,55 +62,11 @@
- + diff --git a/src/compiler/compiler.lisp b/src/compiler/compiler.lisp index 1ea5259..222f660 100644 --- a/src/compiler/compiler.lisp +++ b/src/compiler/compiler.lisp @@ -1155,9 +1155,6 @@ (define-builtin functionp (x) `(bool (=== (typeof ,x) "function"))) -(define-builtin %write-string (x) - `(method-call |lisp| "write" ,x)) - (define-builtin /debug (x) `(method-call |console| "log" (call |xstring| ,x))) diff --git a/src/stream.lisp b/src/stream.lisp index 086b145..d08f52c 100644 --- a/src/stream.lisp +++ b/src/stream.lisp @@ -21,6 +21,9 @@ (/debug "loading stream.lisp!") +(defun %write-string (string) + (#j:jqconsole:Write string "jqconsole-output")) + (defvar *standard-output* (vector 'stream (lambda (ch) (%write-string (string ch))) diff --git a/src/toplevel.lisp b/src/toplevel.lisp index 7dddf6e..42864e6 100644 --- a/src/toplevel.lisp +++ b/src/toplevel.lisp @@ -252,14 +252,35 @@ (defvar *root* (%js-vref "window")) -;;; Set some external entry point to the Lisp implementation to the -;;; console. It would not be necessary when FFI is finished. -(let ((*root* #j:lisp)) - (setf #j:read #'ls-read-from-string) - (setf #j:print #'prin1-to-string) - (setf #j:eval #'eval) - (setf #j:compile (lambda (s) (compile-toplevel s t))) - (setf #j:evalString (lambda (str) (eval (ls-read-from-string str)))) - (setf #j:evalInput (lambda (str) (eval-interactive (ls-read-from-string str)))) - (setf #j:compileString (lambda (str) (compile-toplevel (ls-read-from-string str) t)))) +(defun load-history () + (#j:jqconsole:SetHistory (#j:JSON:parse (#j:localStorage:getItem "jqhist")))) + +(defun save-history () + (#j:localStorage:setItem "jqhist" (#j:JSON:stringify (#j:jqconsole:GetHistory)))) + +(defun toplevel () + (let ((prompt (format nil "~a> " (package-name *package*)))) + (#j:jqconsole:Write prompt "jqconsole-prompt")) + (flet ((process-input (input) + (let* ((form (read-from-string input)) + (result (multiple-value-list (eval-interactive form)))) + (dolist (x result) + (#j:jqconsole:Write (format nil "~S~%" x) "jqconsole-return")) + (save-history)) + (toplevel))) + (#j:jqconsole:Prompt t #'process-input))) + + +;;; KLUDGE: I tried +;;; +;;; (#j:document.addEventListener "load" #'topevel nil) +;;; +;;; but it is not working. So I am using this temporarily to wait +;;; until the DOM is ready before starting the REPL. + +(#j:setTimeout (lambda () + (#j:jqconsole:RegisterMatching "(" ")" "parents") + (load-history) + (toplevel)) + 0) -- 1.7.10.4