+(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))
+ (successp nil)
+ result)
+ ;; Capture errors. We evaluate the form and set successp
+ ;; to T. However, if a non-local exist happens, we cancel
+ ;; it, so it is not propagated more.
+ (block nil
+ (unwind-protect
+ (progn
+ (setq result (multiple-value-list (eval-interactive form)))
+ (setq successp t))
+ (return)))
+
+ (if successp
+ (dolist (x result)
+ (#j:jqconsole:Write (format nil "~S~%" x) "jqconsole-return"))
+ (#j:jqconsole:Write (format nil "Error occurred~%") "jqconsole-error"))
+
+ (save-history))
+ (toplevel)))
+ (#j:jqconsole:Prompt t #'process-input)))
+
+
+(defun init (&rest args)
+ (#j:jqconsole:RegisterMatching "(" ")" "parents")
+ (load-history)
+ (toplevel))
+
+(#j:window:addEventListener "load" #'init)