blob: 0e50c671144bbacbf13636fe95b622dffb70bf89 (
plain)
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
|
(defun sys:dig (ctx)
(whilet ((form (sys:ctx-form ctx))
(anc (unless (source-loc form)
(macro-ancestor form))))
(set ctx anc))
ctx)
(defun sys:loc (ctx)
(source-loc-str (sys:ctx-form ctx)))
(defun compile-error (ctx fmt . args)
(let* ((nctx (sys:dig ctx))
(loc (sys:loc nctx))
(name (sys:ctx-name nctx)))
(let ((msg (fmt `@loc: ~s: @fmt` name . args)))
(when (and *load-recursive*
(null (find-frame 'error 'catch-frame)))
(dump-deferred-warnings *stderr*)
(put-line msg *stderr*))
(throw 'eval-error msg))))
(defun compile-warning (ctx fmt . args)
(let* ((nctx (sys:dig ctx))
(loc (sys:loc nctx))
(name (sys:ctx-name nctx)))
(usr:catch
(throwf 'warning `@loc: warning: ~s: @fmt` name . args)
(continue ()))))
(defun compile-defr-warning (ctx tag fmt . args)
(let* ((nctx (sys:dig ctx))
(loc (sys:loc nctx))
(name (sys:ctx-name nctx)))
(usr:catch
(throw 'defr-warning (fmt `@loc: warning: ~s: @fmt` name . args) tag)
(continue ()))))
(defun sys:bind-mac-error (ctx-form params obj too-few-p)
(cond
((atom obj)
(compile-error ctx-form "extra element ~s not matched by params ~a"
obj params))
((null obj)
(compile-error ctx-form "params ~a require arguments" params))
(t (compile-error ctx-form "too ~a elements in ~s for params ~a"
(if too-few-p "few" "many")
obj params))))
(defun sys:bind-mac-check (ctx-form params obj req fix)
(if (and obj (atom obj))
(compile-error ctx-form "extra element ~s not matched by params ~a"
obj params)
(let ((l (len obj)))
(iflet ((problem (cond
((< l req) "few")
((and fix (> l fix)) "many"))))
(if (zerop l)
(compile-error ctx-form "params ~a require arguments" params)
(compile-error ctx-form "too ~a elements in ~s for params ~a"
problem obj params))))))
(defun lambda-too-many-args (form)
(compile-error form "excess arguments given"))
(defun lambda-too-few-args (form)
(compile-error form "insufficient arguments given"))
(defun lambda-short-apply-list ()
(throwf 'eval-error "~s: applied argument list too short" 'lambda))
(defun lambda-excess-apply-list ()
(throwf 'eval-error "~s: applied argument list too long" 'lambda))
|