-
Notifications
You must be signed in to change notification settings - Fork 0
/
lib.scm
40 lines (34 loc) · 1.14 KB
/
lib.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
#lang racket
(require (except-in eopl #%module-begin))
(local-require "datatypes.scm")
(local-require "references.scm")
(provide lib-env lprint)
;; lprint : List(ExpVal)
(define lprint
(lambda (list-to-print)
(cond
((or (null? list-to-print) (void? (car list-to-print))) (printf "\n"))
((pair? (car list-to-print))
(begin
(if (> (length list-to-print) 1)
(printf (format-expval (car (car list-to-print))))
(for-each (lambda (e) (printf (format-expval e))) (car list-to-print)))
(lprint (cdr list-to-print))))
(else
(begin
(printf (format-expval (car list-to-print)))
(lprint (cdr list-to-print)))))))
(define proc-lprint
(proc-val (lib-procedure '(s) lprint)))
(define format-expval
(lambda (elem)
(cases expval elem
(num-val (n) (format "~a\t" n))
(bool-val (b) (if b "true\t" "false\t"))
(string-val (s) (format "~a\t" s))
(nil-val () "nil\t")
(proc-val (p) "function\t")
(table-val (t) "table\t")
(else "nil\t"))))
(define lib-env (empty-global-env))
(extend-global-env 'print proc-lprint lib-env)