2 votes

Dans un langage Racket personnalisé, comment puis-je définir une macro récursive ?

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 ?

1voto

soegaard Points 6541

Ajouter ... aux identifiants fournis.

#lang racket
(provide #%datum
         #%module-begin
         define-syntax

         (for-syntax syntax-case
                     syntax
                     raise-syntax-error
                     #%app
                     quote
                     quote-syntax
                     ...
                     #%datum))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X