Thanks for all the pointers. I have some reading to do.<br><br>Ryan,<br>I&#39;ll let you know how it works out.<br><br>Doug<br><br><div class="gmail_quote">On Wed, Sep 16, 2009 at 11:52 AM, Ryan Culpepper <span dir="ltr">&lt;<a href="mailto:ryanc@ccs.neu.edu">ryanc@ccs.neu.edu</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">You&#39;ve essentially described the motivation for the new &#39;syntax/parse&#39; library. It has an enhanced pattern language for specifying syntax and abstraction mechanisms for defining syntactic classes. I&#39;ve just committed a quick start introduction with examples in the documentation.<br>

<br>
I&#39;d be very interested in hearing your questions, difficulties, and successes using syntax/parse.<br>
<br>
Another thing you might find helpful is my (rough, incomplete) guide to common macro patterns:<br>
  <a href="http://www.ccs.neu.edu/home/ryanc/macro-patterns/" target="_blank">http://www.ccs.neu.edu/home/ryanc/macro-patterns/</a><br>
<br>
Ryan<br>
<br>
<br>
Doug Williams wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div></div><div class="h5">
I&#39;m finally getting serious about using complex macros for (properly)<br>
parsing and processing domain specific languages in PLT Scheme. To date, I<br>
have just been using syntax-rules to do the minimum parsing needed to break<br>
out the basic elements of a construct and generate code that passes them to<br>
the code that does the real work at run-time. This is relatively easy to<br>
write, but pretty much limits error messages to &#39;bad syntax&#39;, which isn&#39;t<br>
real useful. But, I haven&#39;t found any really good tutorial material to help<br>
me get started.<br>
<br>
So first, can anyone point me to some good material to get started with<br>
syntax-case, define-for-syntax, and so on for doing this right? I&#39;ve gotten<br>
started by looking at things like package.ss (in the scheme collection) that<br>
have some complex macros.<br>
<br>
An example of what I would like to do is the define-rule macro in the<br>
inference collection.<br>
<br>
Here is a contrived example of a forward-chaining rule:<br>
<br>
(define-rule (test-rule-1 test-rule)<br>
    (class1 ?a b c)<br>
    ?class2 &lt;- (class2 ?a b c)<br>
    (or (and (class3 ?a b c)<br>
             (class4 ?a b c))<br>
        (class5 ?a b c))<br>
  ==&gt;<br>
    (retract ?class2)<br>
    (printf &quot;a = ~s~n&quot; ?a))<br>
<br>
And, here is an example of a backward-chaining rule:<br>
<br>
(define-rule (example-rule ancestor-rules)<br>
    (ancestor ?x &gt;y)<br>
  &lt;==<br>
    (ancestor ?x ?z)<br>
    (ancestor ?z ?y))<br>
<br>
In the current (not so good) implementation, the define-rule macro just<br>
breaks the rule clauses into goal clauses, pattern clauses, and action<br>
expressions using &lt;== and &gt;== as delimiters. Then, it just passes those raw<br>
chunks in the run-time code to actually parse and process them.<br>
<br>
I would like to do is to do all of the parsing and checking at expansion<br>
time and provide decent error messages. So, at expansion time, I&#39;d like to<br>
(1) parse out the clauses, (2) check the syntax of the goal and pattern<br>
clauses, (3) normalize the form of the pattern clauses to (or (and .<br>
atomic-patterns) ...), and (4) generate the appropriate code. (Note that the<br>
action expressions are &#39;just code&#39; that will be generated into a procedural<br>
object and &#39;checked&#39; that way.) I am comfortable with (1) and (4) - at least<br>
with syntax-rules - and I have a working version using syntax-case with<br>
error checking at that level (e.g., the rule name must be an identifier;<br>
there can&#39;t be multiple &lt;== or ==&gt;; if both &lt;== and ==&gt; are present, they<br>
must be in that order). I can do (2) in run-time code, but don&#39;t know how to<br>
convert that into expansion-time code - maybe it&#39;s easy, maybe not. Finally,<br>
(3) is some pretty complex run-time code with several mutually recursive<br>
procedures doing the normalization. I don&#39;t even know where to start doing<br>
this (in something other than brute force pattern matching with<br>
syntax-rule/syntax case, but there are several dozens of cases and there has<br>
to be a better way).<br>
<br>
So, can someone point me in the right direction to get started? Good<br>
examples in the current PLT Scheme code base would work.<br>
<br>
And, just for the curious, here is a real example of a forward-chaining rule<br>
to show what they can look like.<br>
<br>
;;; If a cell is numbered, remove that number from any other cell in the<br>
;;; same row, col, or box.<br>
(define-rule (rule-5 sudoku-rules)<br>
    (cell ?row ?col ?box ?value : (number? ?value))<br>
    cell-1 &lt;- (or (cell ?row-1 : (= ?row-1 ?row)<br>
                        ?col-1 : (not (= ?col-1 ?col))<br>
                        ?box-1<br>
                        ?value-1 : (and (pair? ?value-1)<br>
                                        (memv ?value ?value-1)))<br>
                  (cell ?row-1 : (not = (= ?row-1 ?row))<br>
                        ?col-1 : (= ?col-1 ?col)<br>
                        ?box-1<br>
                        ?value-1 : (and (pair? ?value-1)<br>
                                        (memv ?value ?value-1)))<br>
                  (cell ?row-1<br>
                        ?col-1<br>
                        ?box-1 : (and (= ?box-1 ?box)<br>
                                      (or (not (= ?row-1 ?row)<br>
                                          (not (= ?col-1 ?col))))<br>
                        ?value-1 : (and (pair? ?value-1)<br>
                                        (memv ?value ?value-1))))<br>
  ==&gt;<br>
    (replace ?cell-1 `(cell ,?row-1 ,?col-1 ,?box-1 ,(delete ?value<br>
?value-1))))<br>
<br>
As always, thanks in advance for any advice, directions, mentoring, ...<br>
Doug<br>
<br>
<br>
<br></div></div>
------------------------------------------------------------------------<br>
<br>
_________________________________________________<br>
  For list-related administrative tasks:<br>
  <a href="http://list.cs.brown.edu/mailman/listinfo/plt-scheme" target="_blank">http://list.cs.brown.edu/mailman/listinfo/plt-scheme</a><br>
</blockquote>
<br>
</blockquote></div><br>