Commit | Line | Data |
---|---|---|
93a6e9c4 MV |
1 | ;;;; and-let-star.scm --- and-let* syntactic form (draft SRFI-2) for Guile |
2 | ;;;; written by Michael Livshin <mike@olan.com> | |
3 | ;;;; | |
e39bbe80 | 4 | ;;;; Copyright (C) 1999, 2001 Free Software Foundation, Inc. |
93a6e9c4 MV |
5 | ;;;; |
6 | ;;;; This program is free software; you can redistribute it and/or modify | |
7 | ;;;; it under the terms of the GNU General Public License as published by | |
8 | ;;;; the Free Software Foundation; either version 2, or (at your option) | |
9 | ;;;; any later version. | |
10 | ;;;; | |
11 | ;;;; This program is distributed in the hope that it will be useful, | |
12 | ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | ;;;; GNU General Public License for more details. | |
15 | ;;;; | |
16 | ;;;; You should have received a copy of the GNU General Public License | |
17 | ;;;; along with this software; see the file COPYING. If not, write to | |
18 | ;;;; the Free Software Foundation, Inc., 59 Temple Place, Suite 330, | |
19 | ;;;; Boston, MA 02111-1307 USA | |
a482f2cc MV |
20 | ;;;; |
21 | ;;;; As a special exception, the Free Software Foundation gives permission | |
22 | ;;;; for additional uses of the text contained in its release of GUILE. | |
23 | ;;;; | |
24 | ;;;; The exception is that, if you link the GUILE library with other files | |
25 | ;;;; to produce an executable, this does not by itself cause the | |
26 | ;;;; resulting executable to be covered by the GNU General Public License. | |
27 | ;;;; Your use of that executable is in no way restricted on account of | |
28 | ;;;; linking the GUILE library code into it. | |
29 | ;;;; | |
30 | ;;;; This exception does not however invalidate any other reasons why | |
31 | ;;;; the executable file might be covered by the GNU General Public License. | |
32 | ;;;; | |
33 | ;;;; This exception applies only to the code released by the | |
34 | ;;;; Free Software Foundation under the name GUILE. If you copy | |
35 | ;;;; code from other Free Software Foundation releases into a copy of | |
36 | ;;;; GUILE, as the General Public License permits, the exception does | |
37 | ;;;; not apply to the code that you add in this way. To avoid misleading | |
38 | ;;;; anyone as to the status of such modified files, you must delete | |
39 | ;;;; this exception notice from them. | |
40 | ;;;; | |
41 | ;;;; If you write modifications of your own for GUILE, it is your choice | |
42 | ;;;; whether to permit this exception to apply to your modifications. | |
43 | ;;;; If you do not wish that, delete this exception notice. | |
93a6e9c4 MV |
44 | |
45 | (define-module (ice-9 and-let-star)) | |
46 | ||
47 | (defmacro and-let* (vars . body) | |
48 | ||
49 | (define (expand vars body) | |
50 | (cond | |
51 | ((null? vars) | |
52 | `(begin ,@body)) | |
53 | ((pair? vars) | |
54 | (let ((exp (car vars))) | |
55 | (cond | |
56 | ((pair? exp) | |
57 | (cond | |
58 | ((null? (cdr exp)) | |
59 | `(and ,(car exp) ,(expand (cdr vars) body))) | |
60 | (else | |
61 | (let ((var (car exp)) | |
62 | (val (cadr exp))) | |
63 | `(let (,exp) | |
64 | (and ,var ,(expand (cdr vars) body))))))) | |
65 | (else | |
66 | `(and ,exp ,(expand (cdr vars) body)))))) | |
67 | (else | |
68 | (error "not a proper list" vars)))) | |
69 | ||
70 | (expand vars body)) | |
71 | ||
72 | (export-syntax and-let*) |