;; -*-scheme-*-

;;; GNU Mes --- Maxwell Equations of Software
;;; Copyright © 2016 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of GNU Mes.
;;;
;;; GNU Mes is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Mes is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.

;;; Commentary:

;;; syntax.mes is loaded after scm.mes.  It provides the R5RS hygienic
;;; macros define-syntax, syntax-rules and define-syntax-rule.
;;; syntax-rules is adapted from scheme48-1.1/scheme/alt/syntax.scm

;;; Code:
(mes-use-module (mes scm))
(include-from-path "mes/syntax.scm")

(define (syntax-error message thing)
  (display "syntax-error:" (current-error-port))
  (display message (current-error-port))
  (display ":" (current-error-port))
  (display thing (current-error-port))
  (newline (current-error-port)))

(define (silent-syntax-error message thing)
  *unspecified*)

(define-macro (define-syntax-rule id-pattern . template)
  `(define-syntax ,(car id-pattern)
     (syntax-rules ()
       ((,(car id-pattern) . ,(cdr id-pattern)) ,@template))))

(define-macro (let-syntax bindings . rest)
  `((lambda ()
      ,@(map (lambda (binding)
               `(define-macro (,(car binding) . args)
                  (,(cadr binding) (cons ',(car binding) args)
                   (lambda (x0) x0)
                   eq?)))
             bindings)
      ,@rest)))
