;
; Provisional Syntax for Treacle Forms
; Chris Pressey, April 2008
;
; Copyright (c)2008 Cat's Eye Technologies. All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions
; are met:
;
; 1. Redistributions of source code must retain the above copyright
; notices, this list of conditions and the following disclaimer.
; 2. Redistributions in binary form must reproduce the above copyright
; notices, this list of conditions, and the following disclaimer in
; the documentation and/or other materials provided with the
; distribution.
; 3. Neither the names of the copyright holders nor the names of their
; contributors may be used to endorse or promote products derived
; from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
; ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES INCLUDING, BUT NOT
; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
; FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
; COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
; BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
; ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
; POSSIBILITY OF SUCH DAMAGE.
(load "pattern.scm")
;
; Syntax for atomic terms, including patterns and replacements.
;
(define-syntax term-atom
(syntax-rules (* ? :i :o @)
((term-atom *)
(mk-wildcard))
((term-atom @)
(mk-newref))
((term-atom (? name subterm))
(mk-named 'name (term-atom subterm)))
((term-atom (:i subterm))
(mk-hole 'innermost (term-atom subterm)))
((term-atom (:o subterm))
(mk-hole 'outermost (term-atom subterm)))
((term-atom (inner ...))
(term-list inner ...))
((term-atom other)
'other)))
;
; Syntax for list terms.
;
(define-syntax term-list
(syntax-rules ()
((term-list)
'())
((term-list atom rest ...)
(cons (term-atom atom) (term-list rest ...)))))
;
; Syntax for replacements.
;
(define-syntax replacements
(syntax-rules (:)
((replacements)
'())
((replacements name : replacement rest ...)
(cons (cons 'name (term-atom replacement)) (replacements rest ...)))
))
;
; Syntax for rules.
;
(define-syntax rules
(syntax-rules (->)
((rules)
'())
((rules pattern -> (repls ...) rest ...)
(cons (cons (term-atom pattern) (replacements repls ...)) (rules rest ...)))
))