[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Chicken-users] combining syntax-rules and er/ir-macro

Subject: Re: [Chicken-users] combining syntax-rules and er/ir-macro
Date: Wed, 29 Jan 2014 22:05:03 -0700

Thank you Evan, that helps explain the error message I was seeing.
When I make your proposed changes, I get the following:

  <++> my-file.scm
    (define-syntax $%map
      (syntax-rules ()
        ((_ fn () (r ...)) (r ...))
        ((_ fn (x y ...) (r ...)) ($%map fn (y ...) (r ... (fn x))))))

    (define-syntax %map
      (syntax-rules ()
        ((_ fn l ...) ($%map fn (l ...) ())))))

  (define-syntax enum
      (lambda (form inject compare?)
        `(define-values (,(cadr form)
                         ,@(map (lambda (x) (symbol-append (cadr form) '- x))
                                (cddr form)))
           (values ,@((inject '%map) (inject 'quote) (cdr form)))))))

  (enum my foo bar)
  (pretty-print `(,my ,my-foo ,my-bar))

  $ csi -n my-file.scm
  Error: during expansion of (enum ...) - call of non-procedure: %map128

I might assume the problem here is that %map isn't a procedure,
it's syntax, and that the symbol is being properly injected, but
then how do I can a macro from a macro?  I'm not even certain I'm
diagnosing the problem correctly.


On Thu, Jan 30, 2014 at 03:16:57PM +1300, Evan Hanson wrote:
> Hi Alyn,
> On 2014-01-29 18:07, wrote:
> > Why is %map not visible inside enum?
> In order to make `%map` available to the enum transformer, it needs to
> be defined at expansion time, e.g. (this is one way, there may be others):
>     (begin-for-syntax
>       (define-syntax %map
>         (syntax.rules () ...)))
> Also note that because `enum` is an ir transformer, the form provided to
> it will already have been renamed, so as it stands it will most likely
> define something like "my-foo123" rather than "my-foo" -- you'll
> probably have to `inject` those parts of the form in order to have the
> correct identifiers bound as a result </possibly unwelcome observation>.
> Cheers,
> Evan
> _______________________________________________
> Chicken-users mailing list
> address@hidden

my personal website:

reply via email to

[Prev in Thread] Current Thread [Next in Thread]