----- Original Message -----
From: "Michele Simionato" <[email protected]>
To: <[email protected]>
Sent: Sunday, April 19, 2009 3:49 PM
Subject: [ikarus-users] [macrology] a strange behavior of the REPL comparedto script mode


There is a very strange behavior of the Ikarus REPL that I have discovered
a few months ago, but which I found difficult to reduce to a simple test case,
so that I have suffered it. I have now the simple enough test case.

Consider the following x.sls library, which is a greatly simplified version
of my sweet-macros library:

$ cat x.sls
(library (x)
(export syntax-match def-syntax)
(import (rnrs))

(define-syntax syntax-match
 (lambda (y)
   (syntax-case y (sub)
     ((syntax-match x (literal ...) (sub patt skel) ...)
      (for-all identifier? #'(literal ...))
      #'(syntax-case x (literal ...)
          (patt skel)
          ...))
     )))

(define-syntax def-syntax
 (lambda (y)
   (syntax-case y ()
    ((def-syntax name transformer)
         #'(define-syntax name
             (lambda (x)
               (syntax-case x (<source>)
                 ((name <source>) #''(... (... transformer))); comment-me!
                 (x (transformer #'x))))))

   )))
)

The library defines a ``syntax-match`` form which is a simplified version
of syntax-case (no fenders), and such that each clause is
introduced by a literal identifier ``sub``. The library also
defines a ``def-syntax`` form which stores the source code
of the transformer (this happens in the line marked as ``comment-me!``).
The code as it stands is - I believe - correct; you can test it
with the following script:

$ cat xx.ss
(import (rnrs) (x))
(def-syntax macro (lambda (y) (syntax-match y () (sub (ctx x) #'x))))
(display (macro <source>))

Running it, you get the source code of the macro, as you would expect:

$ scheme-script xx.ss
(lambda (y) (syntax-match y () (sub (ctx x) #'x)))

The strange issue is that the script *does not work* at the REPL:

$ ikarus xx.ss
Ikarus Scheme version 0.0.4-rc1+ (revision 1767, build 2009-04-13)
Copyright (c) 2006-2009 Abdulaziz Ghuloum

Unhandled exception:
Condition components:
  1. &message: "invalid syntax"
  2. &syntax:
      form: (syntax-match y () (sub (ctx x) #'x))
      subform: #f
  3. &source-position:
      file-name: "xx.ss"
      character: 51
4. &trace: #<syntax (syntax-match y () (sub (ctx x) #'x)) [char 51 of xx.ss]>

It looks like ``syntax-match`` is unable to recognize the literal identifier
``sub`` at the REPL.

I have tracked down the problem at the line marked as ``comment-me!``.
If I remove it (and I lose the feature of storing the source code
of the macro) there are no differences between the REPL and script
mode. I am baffled about what could be the origin of the problem,
which is quite disturbing, since it means that I cannot define any
macro at the REPL using sweet-macros, and I can test things only
non-interactively, with R6RS scripts :-(

Is this a bug of the REPL, or what? This has caused me lots of
pain and a head scratching ...


IIRC, I had a similar issue. You need to export you syntax literals as 'auxiliary' syntax.

(export ... my-lit ...)

(define-syntax my-lit
  (lambda (x)
     (syntax-violation #f "invalid use of auxiliary keyword" x 'my-lit)

Cheers

leppie

Reply via email to