Thank you very much for your comments, Per! I wasn't aware of Kawa's
implementation, but I will mention it in the next draft.
Initially, I also thought renaming Chez's `alias' to `define-alias'
because it is allowed where a definition is allowed, but then decided
against it because in case the right-hand side is undefined, it does
not really define anything. Moreover, every other definition actually
introduces new bindings, which `alias' doesn't, so dropped the idea of
the `define-' prefix. But Kawa surely has some renaming facility to be
able to support SRFI 212.
Am Di., 22. Sept. 2020 um 21:53 Uhr schrieb Per Bothner <xxxxxx@bothner.com>:
> For the record, the ones that don't work are:
>
> (1)
> (let ((y +))
> (define-alias x y)
> (define y *)
> (free-identifier=? #'x #'y)) ⟹ #f rather than error
>
> This could be an extension because of more liberal Kawa ordering rules;
> I haven't looked into it.
As the R7RS phrase "it is an error" allows an implementation to do
anything, returning `#f' is fine. I haven't tested this example with
Chez, but chances are that it also returns `#f' there. Only a few
syntax expanders actually produce errors when a keyword is redefined
whose meaning has already been used in the same block of definitions.
> (2)
> (alias inject unquote)
> `(list (inject (+ 1 2)) 4)
> ==> (list (inject (+ 1 2)) 4) rather than (list 3 4)
>
> This may be just a missing followAliases call in the implementation.
I hope so because `inject' and `unquote' have become
`free-identifier=?' and that should be test `quasiquote' uses.
> (3)
> (syntax-case #'pear ()
> (pvar
> (let* ()
> (alias fruit pvar)
> (syntax->datum #'(a fruit)))))
> /tmp/x.scm:34:30: reference to pattern variable pvar outside syntax template
> /tmp/x.scm:34:10: invalid argument to location
Does the error happen at the alias statement? If so, it seems that the
test of referencing a pattern variable outside a syntax template is
too eager. It should only raise an error when the binding is actually
used, which could also happen when `fruit' is referenced outside a
syntax template.