diff --git a/collects/compiler/zo-marshal.rkt b/collects/compiler/zo-marshal.rkt index f10a095f3b..da13079be1 100644 --- a/collects/compiler/zo-marshal.rkt +++ b/collects/compiler/zo-marshal.rkt @@ -8,7 +8,9 @@ racket/local racket/list racket/dict - racket/function) + racket/function + racket/pretty + racket/path) (provide/contract [zo-marshal (compilation-top? . -> . bytes?)] @@ -901,6 +903,7 @@ CPT_BYTE_STRING #f out)] + #; [(path? expr) (out-as-bytes expr path->bytes @@ -1024,7 +1027,20 @@ (if (quoted? expr) (out-data (quoted-v expr) out) (let ([s (open-output-bytes)]) - (write expr s) + ;; print `expr' to a string, but print paths + ;; in a special way + (parameterize ([pretty-print-size-hook + (lambda (v mode port) + (and (path? v) + (let ([v (make-relative v)]) + (+ 2 (let ([p (open-output-bytes)]) + (write (path->bytes v) p) + (bytes-length (get-output-bytes p)))))))] + [pretty-print-print-hook + (lambda (v mode port) + (display "#^" port) + (write (path->bytes (make-relative v)) port))]) + (pretty-write expr s)) (out-byte CPT_ESCAPE out) (let ([bstr (get-output-bytes s)]) (out-number (bytes-length bstr) out) @@ -1041,5 +1057,11 @@ (define-struct svector (vec)) +(define (make-relative v) + (let ([r (current-write-relative-directory)]) + (if r + (find-relative-path r v) + v))) + ;; ---------------------------------------- diff --git a/collects/compiler/zo-parse.rkt b/collects/compiler/zo-parse.rkt index 3afd74e4d3..ed2541fdaf 100644 --- a/collects/compiler/zo-parse.rkt +++ b/collects/compiler/zo-parse.rkt @@ -732,7 +732,23 @@ [read-decimal-as-inexact #t] [read-accept-dot #t] [read-accept-infix-dot #t] - [read-accept-quasiquote #t]) + [read-accept-quasiquote #t] + ;; Use a readtable for special path support in escaped: + [current-readtable + (make-readtable + #f + #\^ + 'dispatch-macro + (lambda (char port src line col pos) + (let ([b (read port)]) + (unless (bytes? b) + (error 'read-escaped-path + "expected a byte string after #^")) + (let ([p (bytes->path b)]) + (if (and (relative-path? p) + (current-load-relative-directory)) + (build-path (current-load-relative-directory) p) + p)))))]) (read/recursive (open-input-bytes s))))] [(reference) (make-primval (read-compact-number cp))]