-
Notifications
You must be signed in to change notification settings - Fork 4
/
read.ms
79 lines (75 loc) · 3.16 KB
/
read.ms
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
;;; Copyright 2021 Beckman Coulter, Inc.
;;;
;;; Permission is hereby granted, free of charge, to any person
;;; obtaining a copy of this software and associated documentation
;;; files (the "Software"), to deal in the Software without
;;; restriction, including without limitation the rights to use, copy,
;;; modify, merge, publish, distribute, sublicense, and/or sell copies
;;; of the Software, and to permit persons to whom the Software is
;;; furnished to do so, subject to the following conditions:
;;;
;;; The above copyright notice and this permission notice shall be
;;; included in all copies or substantial portions of the Software.
;;;
;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
;;; DEALINGS IN THE SOFTWARE.
(import
(read)
(software-info))
(software-info:install)
(isolate-mat definitions ()
(define (extract-name str)
(let ([result #f])
(walk-defns-re str 'no-table
(lambda (table name source)
(set! result name)))
result))
(match-let*
(["f" (extract-name "(define (f x) x)")]
["f" (extract-name "(define f (lambda (x) x))")]
["f" (extract-name "(define-syntax f (syntax-rules () ...))")]
["f" (extract-name "(define-syntax (f x) (syntax-case x () ...))")]
["opt" (extract-name "(define-options opt ...)")]
[#f (extract-name "(define- f x)")]
[#f (extract-name "(definegarbage f x)")]
[#f (extract-name "(define-inline 2 x ...)")]
["x" (extract-name "(set! x 5)")]
["x" (extract-name "(set-who! x 'me)")]
[#f (extract-name "(setgarbage! x 'me)")]
[#f (extract-name "(set-! x 'me)")]
[#f (extract-name "(set! (x) 5)")]
[#f (extract-name "(set-who! (x) 'me)")]
[#f (extract-name "(set!bad x 5)")]
["f" (extract-name "(trace-define (f x) x)")]
["f" (extract-name "(trace-define-syntax (f x) x)")]
[#f (extract-name "(trace-trace-define (f x) x)")]
[#f (extract-name "(tracedefine (f x) x)")]
["f" (extract-name "(define-who f x)")]
["f" (extract-name "(meta define (f x) x)")]
["f" (extract-name "(meta define f (lambda (x) x)")]
["f" (extract-name "(meta define-record f (x))")]
[#f (extract-name "(meta meta define (f x) x)")]
[#f (extract-name "(meta set! x y)")]
[#f (extract-name "(field-set! x y)")]
[#f (extract-name "(set-field! x y)")]
[#f (extract-name "(set-top-level-value! 'x y)")]
)
;; Check that all (scheme) exports except set! return #f
(for-each
(lambda (x)
(when (and (not (eq? x 'set!))
(pregexp-match "set.*!" (symbol->string x)))
(let ([expr (format "(~a x y)" x)])
(match (extract-name expr)
[#f 'ok]
[,result
(printf "~a: ~a\n" result expr)
(throw `#(failed ,result ,expr))]))))
(library-exports '(scheme)))
'ok))