<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'><div dir='ltr'>
Hi all!<BR>
&nbsp;<BR>
I want to create macro for creating a DFA automaton (similar to one&nbsp;described here:&nbsp;<A href="http://www.cs.brown.edu/~sk/Publications/Papers/Published/sk-automata-macros/paper.pdf">http://www.cs.brown.edu/~sk/Publications/Papers/Published/sk-automata-macros/paper.pdf</A>&nbsp;)<BR>
&nbsp;<BR>
My desire is that, for example,&nbsp;this form<BR>
&nbsp;<BR>
(automaton init<BR>&nbsp;&nbsp; (init : (c -&gt; more))<BR>&nbsp;&nbsp; (more : (a -&gt; more)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (d -&gt; more)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (r -&gt; END)))<BR>
&nbsp;<BR>
expands to:<BR>
&nbsp;<BR>
(letrec ([curr-state empty]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [init<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda (symbol)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (case symbol<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [(c) (set! curr-state more) 'ok]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [else 'transition-error]))]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [more<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda (symbol)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (case symbol<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [(a) (set! curr-state more) 'ok]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [(d) (set! curr-state more) 'ok]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [(r) (set! curr-state END) 'endstate]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [else 'transition-error]))]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [END<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda (symbol)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'reading-past-end-error)])<BR>&nbsp;&nbsp;&nbsp; (set! curr-state init)<BR>&nbsp;&nbsp;&nbsp; (lambda (c)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (curr-state c))))<BR>
&nbsp;<BR>
&nbsp;<BR>
I've created the&nbsp;following two macros, but unfortunatelly they are wrong:<BR>
&nbsp;<BR>
(define-syntax process-state<BR>&nbsp; (syntax-rules (: -&gt; END)<BR>&nbsp;&nbsp;&nbsp; [(_ (label -&gt; END))<BR>&nbsp;&nbsp;&nbsp;&nbsp; [(label) (set! curr-state END) 'endstate]]<BR>&nbsp;&nbsp;&nbsp; [(_ (label -&gt; new-state))<BR>&nbsp;&nbsp;&nbsp;&nbsp; [(label) (set! curr-state new-state) 'ok]]))<BR>
&nbsp;<BR>
&nbsp;<BR>
(define-syntax automaton<BR>&nbsp; (syntax-rules (: -&gt; END)<BR>&nbsp;&nbsp;&nbsp; [(_ init-state<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (state : transition ...)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...)<BR>&nbsp;&nbsp;&nbsp;&nbsp; (letrec ([curr-state empty]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [state<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda (symbol)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (case symbol<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [(process-state transition)]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [else 'transition-error]))]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [END<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda (symbol)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'reading-past-end-error)])<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set! curr-state init-state)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda (c)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (curr-state c)))]))<BR>
&nbsp;<BR>
Reported error is: case: bad syntax (missing expression after datum sequence) in: ((process-state (c -&gt; more)))<BR>
It seems to me that macro process-state is not expanding at all.<BR>
&nbsp;<BR>
Can somebody tell me what's wrong and how to fix it???<BR>
&nbsp;<BR>
Thanks in advance,<BR>
Racket Noob<BR>                                               </div></body>
</html>