1 |
;;;; srfi-16.scm --- `case-lambda' for Guile |
;;; srfi-16.scm --- case-lambda |
2 |
|
|
3 |
;;; Copyright (C) 2001 Free Software Foundation, Inc. |
;; Copyright (C) 2001, 2002 Free Software Foundation, Inc. |
4 |
;;; |
;; |
5 |
;;; This program is free software; you can redistribute it and/or |
;; This program is free software; you can redistribute it and/or |
6 |
;;; modify it under the terms of the GNU General Public License as |
;; modify it under the terms of the GNU General Public License as |
7 |
;;; published by the Free Software Foundation; either version 2, or |
;; published by the Free Software Foundation; either version 2, or |
8 |
;;; (at your option) any later version. |
;; (at your option) any later version. |
9 |
;;; |
;; |
10 |
;;; This program is distributed in the hope that it will be useful, |
;; This program is distributed in the hope that it will be useful, |
11 |
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 |
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 |
;;; General Public License for more details. |
;; General Public License for more details. |
14 |
;;; |
;; |
15 |
;;; You should have received a copy of the GNU General Public License |
;; You should have received a copy of the GNU General Public License |
16 |
;;; along with this software; see the file COPYING. If not, write to |
;; along with this software; see the file COPYING. If not, write to |
17 |
;;; the Free Software Foundation, Inc., 59 Temple Place, Suite 330, |
;; the Free Software Foundation, Inc., 59 Temple Place, Suite 330, |
18 |
;;; Boston, MA 02111-1307 USA |
;; Boston, MA 02111-1307 USA |
19 |
;;; |
;; |
20 |
;;; As a special exception, the Free Software Foundation gives permission |
;; As a special exception, the Free Software Foundation gives permission |
21 |
;;; for additional uses of the text contained in its release of GUILE. |
;; for additional uses of the text contained in its release of GUILE. |
22 |
;;; |
;; |
23 |
;;; The exception is that, if you link the GUILE library with other files |
;; The exception is that, if you link the GUILE library with other files |
24 |
;;; to produce an executable, this does not by itself cause the |
;; to produce an executable, this does not by itself cause the |
25 |
;;; resulting executable to be covered by the GNU General Public License. |
;; resulting executable to be covered by the GNU General Public License. |
26 |
;;; Your use of that executable is in no way restricted on account of |
;; Your use of that executable is in no way restricted on account of |
27 |
;;; linking the GUILE library code into it. |
;; linking the GUILE library code into it. |
28 |
;;; |
;; |
29 |
;;; This exception does not however invalidate any other reasons why |
;; This exception does not however invalidate any other reasons why |
30 |
;;; the executable file might be covered by the GNU General Public License. |
;; the executable file might be covered by the GNU General Public License. |
31 |
;;; |
;; |
32 |
;;; This exception applies only to the code released by the |
;; This exception applies only to the code released by the |
33 |
;;; Free Software Foundation under the name GUILE. If you copy |
;; Free Software Foundation under the name GUILE. If you copy |
34 |
;;; code from other Free Software Foundation releases into a copy of |
;; code from other Free Software Foundation releases into a copy of |
35 |
;;; GUILE, as the General Public License permits, the exception does |
;; GUILE, as the General Public License permits, the exception does |
36 |
;;; not apply to the code that you add in this way. To avoid misleading |
;; not apply to the code that you add in this way. To avoid misleading |
37 |
;;; anyone as to the status of such modified files, you must delete |
;; anyone as to the status of such modified files, you must delete |
38 |
;;; this exception notice from them. |
;; this exception notice from them. |
39 |
;;; |
;; |
40 |
;;; If you write modifications of your own for GUILE, it is your choice |
;; If you write modifications of your own for GUILE, it is your choice |
41 |
;;; whether to permit this exception to apply to your modifications. |
;; whether to permit this exception to apply to your modifications. |
42 |
;;; If you do not wish that, delete this exception notice. |
;; If you do not wish that, delete this exception notice. |
43 |
|
|
44 |
;;; Commentary: |
;;; Author: Martin Grabmueller |
45 |
|
|
46 |
;;; Implementation of SRFI-16. `case-lambda' is a syntactic form |
;;; Commentary: |
|
;;; which permits writing functions acting different according to the |
|
|
;;; number of arguments passed. |
|
|
;;; |
|
|
;;; The syntax of the `case-lambda' form is defined in the following |
|
|
;;; EBNF grammar. |
|
|
;;; |
|
|
;;; <case-lambda> |
|
|
;;; --> (case-lambda <case-lambda-clause>) |
|
|
;;; <case-lambda-clause> |
|
|
;;; --> (<signature> <definition-or-command>*) |
|
|
;;; <signature> |
|
|
;;; --> (<identifier>*) |
|
|
;;; | (<identifier>* . <identifier>) |
|
|
;;; | <identifier> |
|
|
;;; |
|
|
;;; The value returned by a `case-lambda' form is a procedure which |
|
|
;;; matches the number of actual arguments against the signatures in |
|
|
;;; the various clauses, in order. The first matching clause is |
|
|
;;; selected, the corresponding values from the actual parameter list |
|
|
;;; are bound to the variable names in the clauses and the body of the |
|
|
;;; clause is evaluated. |
|
47 |
|
|
48 |
;;; Author: Martin Grabmueller |
;; Implementation of SRFI-16. `case-lambda' is a syntactic form |
49 |
|
;; which permits writing functions acting different according to the |
50 |
|
;; number of arguments passed. |
51 |
|
;; |
52 |
|
;; The syntax of the `case-lambda' form is defined in the following |
53 |
|
;; EBNF grammar. |
54 |
|
;; |
55 |
|
;; <case-lambda> |
56 |
|
;; --> (case-lambda <case-lambda-clause>) |
57 |
|
;; <case-lambda-clause> |
58 |
|
;; --> (<signature> <definition-or-command>*) |
59 |
|
;; <signature> |
60 |
|
;; --> (<identifier>*) |
61 |
|
;; | (<identifier>* . <identifier>) |
62 |
|
;; | <identifier> |
63 |
|
;; |
64 |
|
;; The value returned by a `case-lambda' form is a procedure which |
65 |
|
;; matches the number of actual arguments against the signatures in |
66 |
|
;; the various clauses, in order. The first matching clause is |
67 |
|
;; selected, the corresponding values from the actual parameter list |
68 |
|
;; are bound to the variable names in the clauses and the body of the |
69 |
|
;; clause is evaluated. |
70 |
|
|
71 |
;;; Code: |
;;; Code: |
72 |
|
|
73 |
(define-module (srfi srfi-16) |
(define-module (srfi srfi-16) |
74 |
:export-syntax (case-lambda)) |
:export-syntax (case-lambda)) |
75 |
|
|
147 |
(let ((,length-name (length ,args-name))) |
(let ((,length-name (length ,args-name))) |
148 |
(cond ,@(gen-clauses clauses length-name args-name)))))) |
(cond ,@(gen-clauses clauses length-name args-name)))))) |
149 |
proc))) |
proc))) |
150 |
|
|
151 |
|
;;; srfi-16.scm ends here |