spec: read/write/display — S-expression reader/writer on ports

Adds read, write, display, newline, write-to-string, display-to-string
and current-*-port primitives to both JS and OCaml hosts.

JS: sxReadNormalize (#t/#f→true/false), sxReadConvert (()→nil),
    sxEq array comparison, sxWriteVal symbol/keyword name fix,
    readerMacroGet/readerMacroSet registry in parser platform.
OCaml: sx_write_val/sx_display_val helpers, read/write/display/newline
    primitives on port types; parser extended for #t/#f and N/D rationals.
42 new tests (test-read-write.sx), all passing on JS and OCaml.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-01 18:32:30 +00:00
parent c8582c4d49
commit 7d329f024d
6 changed files with 621 additions and 9 deletions

View File

@@ -948,6 +948,61 @@
:returns "boolean"
:doc "True if a char is immediately available on the port.")
(define-primitive
"read"
:params (&rest (p :as input-port))
:returns "any"
:doc "Read one datum from port; returns eof-object at end.")
(define-primitive
"write"
:params (v &rest (p :as output-port))
:returns "nil"
:doc "Serialize v to port with quoting — strings quoted, chars as #\\a notation.")
(define-primitive
"display"
:params (v &rest (p :as output-port))
:returns "nil"
:doc "Serialize v to port without quoting — strings unquoted, chars as characters.")
(define-primitive
"newline"
:params (&rest (p :as output-port))
:returns "nil"
:doc "Write a newline to port.")
(define-primitive
"write-to-string"
:params (v)
:returns "string"
:doc "Serialize v with write quoting, return as string.")
(define-primitive
"display-to-string"
:params (v)
:returns "string"
:doc "Serialize v with display format, return as string.")
(define-primitive
"current-input-port"
:params ()
:returns "any"
:doc "Return current default input port.")
(define-primitive
"current-output-port"
:params ()
:returns "any"
:doc "Return current default output port.")
(define-primitive
"current-error-port"
:params ()
:returns "any"
:doc "Return current error port.")
(define-module :stdlib.math)
(define-primitive