;;;;
;;;; 31.stk        -- A special form rec for recursive evaluation
;;;;
;;;; Copyright © 2002-2022 Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
;;;;
;;;;
;;;; This program 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 2 of the License, or
;;;; (at your option) any later version.
;;;;
;;;; This program 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 this program; if not, write to the Free Software
;;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
;;;; USA.
;;;;
;;;;           Author: Erick Gallesio [eg@essi.fr]
;;;;    Creation date:  3-Dec-2002 21:31 (eg)
;;;;

;;; The implementation given in the SRFI-31 document

;; (define-syntax rec
;;   (syntax-rules ()
;;     ((rec (name . variables) . body)
;;      (letrec ( (name (lambda variables . body)) ) name))
;;     ((rec name expression)
;;      (letrec ( (name expression) ) name))))

(define-module srfi/31
  (export rec)

  (define-macro (rec name . body)
    (if (symbol? name)
        (if (= (length body) 1)
            `(letrec ((,name ,@body)) ,name)
            (error "rec: bad syntax"))
        (let ((name     (car name))
              (bindings (cdr name)))
          `(letrec ((,name (lambda ,bindings ,@body))) ,name))))
)

(provide "srfi/31")
