Re: Keyword arguments in procedures specified in SRFIs
shiro.kawai@xxxxxx 26 Jul 2019 14:20 UTC
Use write/ss. Identical uninterned symbols are written out using SRFI-38 notation ( #n= and #n# ), so that the eq? identity is preserved when read back.
Sent from my iPhone
On Jul 24, 2019, at 2:11 AM, Lassi Kortela <xxxxxx@lassi.io> wrote:
>> are there other differences
>> between interned and uninterned symbols than comparing inequal
>> That's the sole purpose. In the Scheme world it can be solved by hygienc macros. However, if you want to dump the generated code and read it back, a symbol that guaranteed no name conflict comes handy.
>
> I think I misunderstand what you're saying. How do you write some code that uses gensyms, and then read it back while keeping multiple references to the same gensyms? I tried the following test in Gauche:
>
> (let* ((s (let ((port (open-output-string)))
> (write (gensym) port)
> (get-output-string port)))
> (g1 (read (open-input-string s)))
> (g2 (read (open-input-string s))))
> (list s
> g1
> g2
> (eq? g1 g1)
> (eq? g2 g2)
> (eq? g1 g2)))
> ;; => ("#:G100" #:G100 #:G100 #t #t #f)
>
> (let* ((s (let ((port (open-output-string)))
> (let ((g (gensym)))
> (write (cons g g) port))
> (get-output-string port)))
> (gs (read (open-input-string s))))
> (list s
> gs
> (eq? (car gs) (cdr gs))))
> ;; => ("(#:G101 . #:G101)" (#:G101 . #:G101) #f)
>
> According to these tests, an uninterned symbol read from a port is never equal to another uninterned symbol with the same name, even if the references are embedded in the same data structure (here, a cons cell).