[plt-scheme] Re: Macros and Matching
Paulo J. Matos skrev:
> On 13/07/07, Paulo J. Matos <pocm at soton.ac.uk> wrote:
>> Just found why doesn't work. From R5RS:
>> "The keyword at the beginning of the pattern in a <syntax rule> is not
>> involved in the matching and is not considered a pattern variable or
>> literal identifier."
>>
>> Any ideas on the best way to solve this?
Well, syntax-case matches the keyword in the beginning, so replacing
syntax-rules with syntax-case does the trick:
(module test mzscheme
(define-syntax (machine stx)
(syntax-case stx ()
[(_ mname sexps ...)
(identifier? #'mname) ; fender
(let* ([sections (syntax->list #'(sexps ...))]
[parts
(map (lambda (section)
(syntax-case section (variables properties)
((variables (name type value) ...)
#'(begin (printf "Var ~a : ~a -> ~a~n"
'name 'type 'value) ...))
((properties formula ...)
#'(begin (printf "Prop ~a~n" 'formula) ...))))
sections)])
#`(begin
#, at parts))]))
(machine test
(variables
(a integer 0)
(b boolean false))
(properties
(=> a b))))
;;; Output
Var a : integer -> 0
Var b : boolean -> false
Prop (=> a b)
--
Jens Axel Søgaard