On Sun, 27 Aug 2017 20:36:53 -0400 Mark H Weaver <m...@netris.org> wrote: > Matt Wette <matt.we...@gmail.com> writes: > > > Q1) The code below creates two macros. One called `define-foo' > > which generates a new identifier and then defines that to #t. The > > other, `define-foo/p', generates the same identifier (lexical > > issue?) and another identifier, then "calls" define-foo and then > > uses both identifiers in a `define'. When executed I get this > > error: > > > > scheme@(guile-user)> (define-foo/p abc) > > ;;; <stdin>:2:0: warning: possibly unbound variable `wrap-abc' > > <unnamed port>:2:0: <unnamed port>:2:0: In procedure module-lookup: > > Unbound variable: wrap-abc > > > > What am I doing wrong here? > > The problem is that in Guile 2.2, whenever (define <id> ...) is found > in the expanded code, where <id> was introduced by a macro (i.e. not > passed as an explicit argument to the macro), Guile will rewrite the > <id> into a new name based on the hash of the entire definition form. > > I don't know of any way to make this work without passing 'wrap-abc' > explicitly as an argument to the 'define-foo' macro. > > FWIW, I've always been opposed to these non-standard semantics, but > they were included in Guile 2.2 over my strenuous objections: > > https://lists.gnu.org/archive/html/guile-devel/2014-01/msg00061.html > https://lists.gnu.org/archive/html/guile-devel/2011-11/msg00021.html > https://lists.gnu.org/archive/html/guile-devel/2011-11/msg00042.html
How interesting. There seems very little uniformity in how the different schemes which I happen to have available deal with the issue of top level hygiene with nested macros. Given the example in paragraph 6.10.10 of the guile-2.2 manual, after the definitions of both 'foo' and 'bar' have both been made the following schemes evaluate '(foo)' as 37: guile-2.0, chicken; and the following evaluate it as 42: guile-2.2, chez, kawa. Chris