scm: Fix psyntax/keyword/optargs interaction bug.
[mes.git] / tests / optargs.test
1 #! /bin/sh
2 # -*-scheme-*-
3 echo ' ()' | cat $(dirname $0)/../module/mes/base-0.mes $0 /dev/stdin | $(dirname $0)/../scripts/mes $MES_FLAGS "$@"
4 #paredit:||
5 exit $?
6 !#
7
8 ;;; -*-scheme-*-
9
10 ;;; Mes --- Maxwell Equations of Software
11 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
12 ;;;
13 ;;; This file is part of Mes.
14 ;;;
15 ;;; Mes is free software; you can redistribute it and/or modify it
16 ;;; under the terms of the GNU General Public License as published by
17 ;;; the Free Software Foundation; either version 3 of the License, or (at
18 ;;; your option) any later version.
19 ;;;
20 ;;; Mes is distributed in the hope that it will be useful, but
21 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
22 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 ;;; GNU General Public License for more details.
24 ;;;
25 ;;; You should have received a copy of the GNU General Public License
26 ;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
27
28 (cond-expand
29  (guile-2)
30  (guile
31   (use-modules (ice-9 optargs)))
32  (mes
33   (mes-use-module (mes optargs))
34   (mes-use-module (mes test))))
35
36 (pass-if-equal "cond =>" 10
37   (cond
38    (5 => (lambda (p) (* p 2)))))
39 (pass-if-equal "cond => 2" 10
40   (cond
41    (#f (display "hallo") (newline))
42    (5 => (lambda (p) (* p 2)))
43    (#t (display "wereld" (newline)))))
44 (pass-if-equal "cond => last" 10
45   (cond
46    (#f (display "hallo") (newline))
47    (5 => (lambda (p) (* p 2)))))
48
49 (pass-if "keyword?" (keyword? #:foo))
50 (pass-if "keywords" (eq? #:foo #:foo))
51 (pass-if-equal "keyword->symbol" 'foo (keyword->symbol #:foo))
52 (pass-if-equal "symbol->keyword" #:foo (symbol->keyword 'foo))
53 (pass-if-not "keywords" (eq? #:foo ':foo))
54 (pass-if "optargs #:optional" ((lambda* (#:optional (x #f)) x) #t))
55 (pass-if-equal "optargs #:optional default" #f ((lambda* (#:optional (x #f)) x)))
56 (pass-if "optargs key" ((lambda* (#:key (foo #f)) foo) #:foo #t))
57 (pass-if-equal "optargs key default" #f ((lambda* (#:key (foo #f)) foo)))
58
59 (mes-use-module (mes pmatch))
60
61 (define <info> '<info>)
62 (define <functions> '<functions>)
63 (define <globals> '<globals>)
64 (define <locals> '<locals>)
65 (define <text> '<text>)
66
67 (define* (make o #:key (functions '()) (globals '()) (locals '()) (text '()))
68   (pmatch o
69     (<info> (list <info>
70                   (cons <functions> functions)
71                   (cons <globals> globals)
72                   (cons <locals> locals)
73                   (cons <text> text)))))
74
75 ;; (define* (make o #:key (functions '()) (globals '()) (locals '()) (text '()))
76 ;;   (format (current-error-port) "make\n")
77 ;;   ((cond ((info? o)
78 ;;           (list <info>
79 ;;                 (cons <functions> functions)
80 ;;                 (cons <globals> globals)
81 ;;                 (cons <locals> locals)
82 ;;                 (cons <text> text))))))
83
84 (define (.functions o)
85   (pmatch o
86     ((<info> . ,alist) (assq-ref alist <functions>))))
87
88 (define (.globals o)
89   (pmatch o
90     ((<info> . ,alist) (assq-ref alist <globals>))))
91
92 (define (.locals o)
93   (pmatch o
94     ((<info> . ,alist) (assq-ref alist <locals>))))
95
96 (define (.text o)
97   (pmatch o
98     ((<info> . ,alist) (assq-ref alist <text>))))
99
100 (define (info? o)
101   (and (pair? o) (eq? (car o) <info>)))
102
103 ;; FIXME: psyntax+pmatch+optarg is broken; BINDINGS-> (g1234 g1234)
104 ;; iso (function function)
105 ;; (define (clone o . rest)
106 ;;   (pmatch o
107 ;;     ((<info>
108 ;;       (<functions> . ,functions)
109 ;;       (<globals> . ,globals)
110 ;;       (<locals> . ,locals)
111 ;;       (<text> . ,text))
112 ;;      (let-keywords rest
113 ;;                    #f
114 ;;                    ((functions functions)
115 ;;                     (globals globals)
116 ;;                     (locals locals)
117 ;;                     (text text))
118 ;;                    (make <info> #:functions functions #:globals globals #:locals locals #:text text)))))
119
120 (define (clone o . rest)
121   (format (current-error-port) "clone rest=~a\n" rest)
122   (cond ((info? o)
123          (let ((functions (.functions o))
124                (globals (.globals o))
125                (locals (.locals o))
126                (text (.text o)))
127            (let-keywords rest
128                          #f
129                          ((functions functions)
130                           (globals globals)
131                           (locals locals)
132                           (text text))
133                          (make <info> #:functions functions #:globals globals #:locals locals #:text text))))))
134
135 (pass-if-equal "clone <info>"
136     (make <info> #:functions '(0))
137   (clone (make <info>) #:functions '(0)))
138
139 (result 'report)