aboutsummaryrefslogtreecommitdiff
path: root/racket/printer.rkt
blob: 07a8bb883c428b41cb1be391c06db364f2fdcdba (plain)
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
#lang racket

(provide pr_str pr_lst)

(require "types.rkt")

(define (pr_str obj print_readably)
  (let ([_r print_readably])
    (cond
      [(list? obj)
       (string-join (map (lambda (o) (pr_str o _r)) obj)
                    " " #:before-first "(" #:after-last ")")]
      [(vector? obj)
       (string-join (map (lambda (o) (pr_str o _r)) (vector->list obj))
                    " " #:before-first "[" #:after-last "]")]
      [(hash? obj)
       (string-join (dict-map obj (lambda (k v)
                                    (format "~a ~a"
                                            (pr_str k _r)
                                            (pr_str v _r))))
                    " " #:before-first "{" #:after-last "}")]
      [(string? obj)
       (if (regexp-match #px"^\u029e" obj)
         (format ":~a" (substring obj 1))
         (if _r
           (format "\"~a\""
             (string-replace
               (string-replace
                 (string-replace obj "\\" "\\\\")
                 "\"" "\\\"")
                "\n" "\\n"))
           obj))]
      [(number? obj) (number->string obj)]
      [(symbol? obj) (symbol->string obj)]
      [(atom? obj) (format "(atom ~a)" (atom-val obj))]
      [(_nil? obj) "nil"]
      [(eq? #t obj) "true"]
      [(eq? #f obj) "false"]
      [else (format "~a" obj)])))

(define (pr_lst lst print_readably sep)
  (string-join
    (map (lambda (s) (pr_str s print_readably)) lst)
    sep))