J'essaie de créer une macro récursive dans un langage Racket personnalisé. Cependant, alors que la macro se développe correctement avec #lang racket
il échoue lorsqu'il est mis en œuvre avec mon nouveau langage.
Par exemple, voici la définition récursive d'une macro simple f
qui se développe jusqu'à son dernier argument :
;; my-lang.rkt
#lang racket
(provide #%datum
#%module-begin
define-syntax
(for-syntax syntax-case
syntax
raise-syntax-error
#%app
quote
#%datum))
#lang s-exp "my-lang.rkt"
(define-syntax (f stx)
(syntax-case stx ()
[(_ x) #'x]
[(_ x xs ...) #'(f xs ...)]
[_ (raise-syntax-error 'f "bad syntax" stx)]))
(f 1 2 3) ; => f: bad syntax in: (f 2 3)
Pourquoi n'est-ce pas (f 2 3)
jumelés et élargis ?