-
Notifications
You must be signed in to change notification settings - Fork 0
/
variable-capture.lisp
61 lines (50 loc) · 1.27 KB
/
variable-capture.lisp
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
(defmacro for ((var start stop) &body body)
`(do ((b #'(lambda (,var) ,@body))
(count ,start (1+ count))
(limit ,stop))
((> count limit))
(funcall b count)))
(defmacro for2 ((var start stop) &body body)
(let ((gstop (gensym)))
`(do ((,var ,start (1+ ,var))
(,gstop ,stop))
((> ,var ,gstop))
,@body)))
(defmacro echo (&rest args)
`'(,@args amen))
(defun foo ()
(echo x))
(defun ntha (n lst)
(if (= n 0)
(car lst)
(ntha (- n 1) (cdr lst))))
(defmacro nthb (n lst)
`(if (= ,n 0)
(car ,lst)
(nthb (- ,n 1) (cdr ,lst))))
(defmacro nthc (n lst)
`(do ((n2 ,n (1- n2))
(lst2 ,lst (cdr lst2)))
(((= n2 0) (car lst2)))))
(defmacro nthd (n lst)
`(ntha ,n ,lst))
(defmacro nthe (n lst)
`(labels ((nth-fn (n lst)
(if (= n 0)
(car lst)
(nth-fn (- n 1) (cdr lst)))))
(nth-fn ,n ,lst)))
(defmacro ora (&rest args)
(or-expand args))
(defun or-expand (args)
(if (null args)
nil
(let ((sym (gensym)))
`(let ((,sym ,(car args)))
(if ,sym ,sym ,(or-expand (cdr args)))))))
(defmacro orb (&rest args)
(if (null args)
nil
(let ((sym (gensym)))
`(let ((,sym ,(car args)))
(if ,sym ,sym (orb ,@(cdr args)))))))