Re: Keyword arguments in procedures specified in SRFIs
Lassi Kortela 24 Jul 2019 12:11 UTC
> 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).