forked from vizziv/Dwimiykwim
-
Notifications
You must be signed in to change notification settings - Fork 0
/
repl.scm
81 lines (66 loc) · 2.33 KB
/
repl.scm
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
;;;; Read-eval-print loop for extended Scheme interpreter
(declare (usual-integrations write write-line pp eval))
(define printable-representation
(make-generic-operator 1 'printable-representation identity))
(define write
(compose (access write user-initial-environment)
printable-representation))
(define write-line
(compose (access write-line user-initial-environment)
printable-representation))
(define pp
(compose (access pp user-initial-environment)
printable-representation))
(defhandler printable-representation
(lambda (procedure)
(vector '<compound-procedure>
(compound-procedure-vars procedure)
(compound-procedure-bproc procedure)))
compound-procedure?)
(defhandler printable-representation
(lambda (procedure)
(vector '<madlab-procedure>
(madlab-procedure-varpreds procedure)
(madlab-procedure-bproc procedure)))
madlab-procedure?)
(defhandler printable-representation
(lambda (x)
(vector '<tagged>
(printable-representation (%tagged-data x))
(printable-representation (%tagged-tags x))))
tagged?)
(defhandler printable-representation
(lambda (x)
(cons (printable-representation (car x))
(printable-representation (cdr x))))
pair?)
(defhandler printable-representation
(lambda (x)
(vector-map printable-representation x))
vector?)
(define the-global-environment 'not-initialized)
(define (init)
(set! the-global-environment
(extend-environment '() '() the-empty-environment))
(for-each (lambda (exp) (eval exp the-global-environment)) library-exps)
(repl))
(define (repl)
(if (eq? the-global-environment 'not-initialized)
(error "Interpreter not initialized. Run (init) first."))
(let* ((input (prompt-for-command-expression ";dwimiykwim>\n"))
(output (eval input the-global-environment)))
(write-string ";=> ")
(write-line output)
(repl)))
(define go repl)
(define (load-library filename)
(if (eq? the-global-environment 'not-initialized)
(error "Interpreter not initialized. Run (init) first."))
(with-input-from-file filename
(lambda ()
(let lp ((input (read)))
(if (not (eof-object? input))
(begin
(write-line (eval input the-global-environment))
(lp (read)))
'done)))))