Fix guild compile --to=cps / --from=cps
authorAndy Wingo <wingo@pobox.com>
Thu, 23 Feb 2017 10:37:44 +0000 (11:37 +0100)
committerAndy Wingo <wingo@pobox.com>
Thu, 23 Feb 2017 10:37:44 +0000 (11:37 +0100)
* module/language/cps/spec.scm (read-cps, write-cps): Fix CPS
  serialization and parsing, so that "guild compile" works with --to=cps
  and --from=cps.

module/language/cps/spec.scm

index 7330885abaa32da53c904c775945b545cc9f861e..e2c46d275ca6c4958b0c5b8363c53c541502a530 100644 (file)
 ;;; Code:
 
 (define-module (language cps spec)
+  #:use-module (ice-9 match)
   #:use-module (system base language)
   #:use-module (language cps)
+  #:use-module (language cps intmap)
   #:use-module (language cps compile-bytecode)
   #:export (cps))
 
+(define (read-cps port env)
+  (let lp ((out empty-intmap))
+    (match (read port)
+      ((k exp) (lp (intmap-add! out k (parse-cps exp))))
+      ((? eof-object?)
+       (if (eq? out empty-intmap)
+           the-eof-object
+           (persistent-intmap out))))))
+
 (define* (write-cps exp #:optional (port (current-output-port)))
-  (write (unparse-cps exp) port))
+  (intmap-fold (lambda (k cps port)
+                 (write (list k (unparse-cps cps)) port)
+                 (newline port)
+                 port)
+               exp port))
 
 (define-language cps
   #:title      "CPS Intermediate Language"
-  #:reader     (lambda (port env) (read port))
+  #:reader     read-cps
   #:printer    write-cps
-  #:parser      parse-cps
   #:compilers   `((bytecode . ,compile-bytecode))
   #:for-humans? #f
   )