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
|
(macro-time
(defun sys:name-str (kind sym-or-string)
(cond
((symbolp sym-or-string) (symbol-name sym-or-string))
((stringp sym-or-string) sym-or-string)
(t (throw 'eval-error "~s: ~s isn't a valid ~a name"
'defpackage sym-or-string kind)))))
(defmacro defpackage (name . clauses)
(let* ((pkg (gensym "pkg-"))
(name-str (sys:name-str 'package name))
(exp-clauses (append-each ((c clauses))
(tree-case c
((keyword . rest)
(caseql keyword
(:use
(if rest ^((use-package ',rest ,pkg))))
(:use-syms
^((each ((s ',rest))
(use-sym s ,pkg))))
(:local
^((each ((n ',(mapcar (op sys:name-str 'symbol)
rest)))
(let ((s (intern n ,pkg)))
(unless (eq (symbol-package s) ,pkg)
(unuse-sym s ,pkg)
(intern n ,pkg))))))))
(atom
(throwf 'eval-error "~s: invalid clause: ~s"
'defpackage atom))))))
^(let ((,pkg (or (find-package ,name-str)
(make-package ,name-str))))
,*(unless (assoc :use clauses) ^((use-package "usr" ,pkg)))
,*exp-clauses
,pkg)))
|