File: closure.test

package info (click to toggle)
mes 0.24.2-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, sid
  • size: 6,908 kB
  • sloc: ansic: 24,104; lisp: 11,490; sh: 6,609; asm: 187; makefile: 36
file content (120 lines) | stat: -rwxr-xr-x 2,874 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#! /bin/sh
# -*-scheme-*-
exec ${MES-bin/mes} --no-auto-compile -L ${0%/*} -L module -C module -e '(tests closure)' -s "$0" "$@"
!#

;;; -*-scheme-*-

;;; GNU Mes --- Maxwell Equations of Software
;;; Copyright © 2016,2018 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/>.

(define-module (tests closure)
  #:use-module (mes mes-0)
  #:use-module (mes test))

(mes-use-module (mes test))

(pass-if "first dummy" #t)
(pass-if-not "second dummy" #f)

(define b 0)
(define x (lambda () b))
(define (x) b)
(pass-if-equal "closure" 0 (x))
(display "===>") (display (x)) (newline)
(define (c b)
  (x))
(pass-if "closure 2" (seq? (c 1) 0))

(define (x)
  (define b 1)
  (define (y) b)
  (set! b 0)
  (list b
        (let ((b 2))
          (y))))

(pass-if "closure 3" (sequal? (x) '(0 0)))

(pass-if "closure 4 "
  (seq? (let ()
          (let ((count (let ((counter 0))
                         (lambda ()
                           counter))))
            (count)))
        0))

(pass-if "closure 5 "
         (seq?
          (let ()
            (define name? 2)
            (define (foo)
              (define name? 0)
              (lambda () name?))
            ((foo)))
          0))

(pass-if "closure 6 "
         (seq?
          (let ()
            (define foo
              (lambda ()
                (define name? symbol?)
                (lambda ()
                  (name? 'boo))))
            ((foo)))
               #t))

(define-macro (foo? q+q)
  #t)
(foo? 'cons)
(pass-if-equal "closure 7" #f (defined? 'q+q))

(let ((x 0))
  (pass-if-equal "closure 8" #f (not (defined? 'x))))

((lambda ()
   (define sc-expand #f)
   ((lambda (g38)
      (set! sc-expand
            ((lambda ()
               (lambda ()
                 (list g38))))))
    "noexpand")
   (pass-if "closure 9" (sc-expand))))

(pass-if "closure is procedure"
             (procedure? (lambda () #t)))

(pass-if-not "closure is not a pair"
             (pair? (lambda () #t)))

(define shared
  (let ((x 0))
    (lambda () (set! x (+ 1 x)) x)))
(define-macro (share)
  (list 'begin
        (list 'shared)))

(pass-if-equal "shared variable macro access"
    2
  (begin
    (share)
    (shared)))

(result 'report)