-
Notifications
You must be signed in to change notification settings - Fork 4
/
macros.liso
99 lines (70 loc) · 1.94 KB
/
macros.liso
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
#lang liso
;; swap macro (implemented as the <=> operator)
@define-syntax-rule x <=> y:
@vars temp = x:
x := y
y := temp
a = 1, b = 2
displayln => [a, b]
a <=> b
displayln => [a, b]
;; A clone of cond, backed with <if>_<else>
@define-syntax kond:
@syntax-rules []:
{@kond: {}} =>
#f
{@kond: {test => body, rest, ...}} =>
body <if> test <else> {@kond: {rest, ...}}
@kond:
0 > 0 => "a"
0 < 0 => "b"
0 == 0 => "c"
0 /= 0 => "d"
;; Takes an arbitrary number of expressions and "threads" each result
;; into the first argument of the next call. It recognizes lambdas.
;; thread[a, b[c], d, [e] -> f]
;; ==> {[e] -> f}[d[b[a, c]]]
@define-syntax thread-one:
@syntax-rules [->, list, begin]:
_[v, x -> y] => {x -> y}[v]
_[v, f[args, ...]] => f[v, args, ...]
_[v, f] => f[v]
@define-syntax thread:
@syntax-rules [list, begin]:
thread[init, {entry, ...}] =>
thread[init, entry, ...]
thread[init, entry] =>
thread-one[init, entry]
thread[init, entry, rest, ...] =>
thread[thread-one[init, entry], rest, ...]
thread[[1, 2, 3, 4], reverse, car, * 10]
@thread [1, 2, 3, 4]:
reverse
car
* 10
[x] -> x / 3
;; Aliasing thread to the |> operator
@define-syntax-rule {|>}[x, ...]:
thread[x, ...]
[1, 2, 3, 4] |>
reverse
car
* 10
[x] -> x / 3
[1, 2, 3] |> car |> {+ 1} |> {* 8}
;; for
@define-syntax for:
@syntax-rules [list, begin]:
for[{}, body, ...] =>
{body, ...}
for[{spec, rest, ...}, body, ...] =>
for[spec, for[{rest, ...}, body, ...]]
for[var = start <to> end <by> increment, body, ...] =>
@vars loop[var = start]:
@when var <= end:
body, ..., loop[var + increment]
for[var = start <to> end, body, ...] =>
for[var = start <to> end <by> 1, body, ...]
@for x = 1 <to> 3, y = 10 <to> 30 <by> 10:
display[[x, y]]
newline[]