-
Notifications
You must be signed in to change notification settings - Fork 47
/
repl.sibilant
59 lines (52 loc) · 2.08 KB
/
repl.sibilant
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
(defvar input (process.open-stdin)
output process.stdout
vm (require 'vm)
readline (send (require 'readline) create-interface input output)
sibilant (require "./sibilant")
context undefined
cmd-buffer ""
sys (require 'sys))
(defun create-context ()
(defvar context (vm.create-context))
(set module 'filename (concat (process.cwd) "/exec"))
(set context
'module module
'require require)
(each-key key global (set context key (get global key)))
context)
(setf context (create-context))
(defun display-prompt ()
(readline.set-prompt
(concat (if (> cmd-buffer.length 10)
(concat "..." (cmd-buffer.slice -10))
(if (> cmd-buffer.length 0) cmd-buffer "sibilant"))
"> "))
(readline.prompt))
(readline.on 'line
(lambda (cmd)
(defvar js-line "")
(try
(progn
(setf cmd-buffer (concat cmd-buffer cmd))
(each (stmt) (sibilant.tokenize cmd-buffer)
(setf js-line (concat js-line
(sibilant.translate stmt 'statement))))
(defvar result (vm.run-in-context js-line context "sibilant-repl"))
(set readline.history 0 cmd-buffer)
(when (defined? result)
(output.write (concat "result: "
(sys.inspect result) "\n")))
(set context "_" result)
(setf cmd-buffer ""))
(progn
(if (e.message.match /unexpected EOF/)
(progn
(setf cmd-buffer (concat cmd-buffer " "))
(readline.history.shift))
(progn
(set readline.history 0 cmd-buffer)
(output.write (concat e.stack "\n"))
(setf cmd-buffer "")))))
(display-prompt)))
(readline.on 'close input.destroy)
(display-prompt)