2012-04-10 22 views
8

Mi piacerebbe creare un modulo sintattico in Racket che possa accettare un argomento di parole chiave, come alcune funzioni possono.Le macro di Racket possono assumere argomenti di parole chiave?

aver ridotto ad un semplice esempio, ho provato a scrivere:

(define-syntax sum-of-products 
    (syntax-rules (#:extra) 
    [(sum-of-products ([a b] ...)) 
    (+ (* a b) ...)] 
    [(sum-of-products ([a b] ...) #:extra extra) 
    (+ extra (* a b) ...)])) 

tale che la seguente sarebbe poi lavorare:

(sum-of-products ([2 2] [3 3])) → 13 
(sum-of-products ([2 2] [3 3]) #:extra 5) → 18 

Purtroppo, Racket chiama questo "cattivo sintassi", quindi ovviamente quel tentativo non era corretto.

Questo può essere fatto?

risposta

12

Le parole chiave nei motivi sintattici sono trattate come valori letterali come numeri ecc., Quindi non è necessario specificarle come parole chiave. (Che serve solo per gli identificatori.) Quindi, le seguenti opere (si noti che ho fissato l'errore di battitura si aveva nel secondo esempio):

#lang racket 
(define-syntax sum-of-products 
    (syntax-rules() 
    [(sum-of-products ([a b] ...)) 
    (+ (* a b) ...)] 
    [(sum-of-products ([a b] ...) #:extra extra) 
    (+ extra (* a b) ...)])) 
(sum-of-products ([2 2] [3 3])) 
(sum-of-products ([2 2] [3 3]) #:extra 5) 

Vedi anche syntax-parse per un programma di utilità che può rendere più facile parsing keywords.

+3

In particolare, la documentazione 'syntax-parse' ha un'intera [sezione] (http://docs.racket-lang.org/syntax/Optional_Keyword_Arguments.html) sulla scrittura di macro con argomenti di parole chiave. –

+0

(Ugh, ho dimenticato di aggiungere quel link ...) –