-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathhelper.shen
87 lines (68 loc) · 1.79 KB
/
helper.shen
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
\* symbol helpers *\
(set gensymbol-current-number 0)
(define gensymbol
String -> (intern (make-string "~A~A" String (set gensymbol-current-number (+ 1 (value gensymbol-current-number)))))
)
\* list helpers *\
(define foldr
_ U [] -> U
F U List -> (F (head List) (foldr F U (tail List)))
)
(define traverse
Merge U F [] -> U
Merge U F [Branch | Branches] -> (Merge (traverse Merge U F Branch) (traverse Merge U F Branches))
Merge U F Tip -> (F Tip)
)
(define walk
F List -> (traverse (/. X Y [X | Y])
[] F
List)
)
(define replace
Function Replacement List -> (walk (/. X (if (Function X)
Replacement
X))
List)
)
(define repeat
N _ -> [] where (<= N 0)
N X -> [X | (repeat (- N 1) X)]
)
(define replace-val
Val Replacement List -> (replace (/. X (= X Val)) Replacement List)
)
(define symbol->string
Symbol -> (concat-strings (explode Symbol)) where (symbol? Symbol)
_ -> (simple-error "Not a symbol")
)
(define all?
[] -> true
[Head | Tail] -> (and Head (all? Tail))
)
(define any?
List -> (foldr (function or) false List)
)
(define replace-with
_ _ [] -> []
X Y [X | Tail] -> [Y | Tail]
X Y [Z | Tail] -> [Z | (replace X Y Tail)]
)
(define filter
F [] -> []
F [El | Rest] -> [El | (filter F Rest)] where (F El)
F [_ | Rest] -> (filter F Rest)
)
(define member?
X [] -> false
X [ X | _ ] -> true
X [ _ | Y ] -> (member? X Y)
)
(define concat-strings
[] -> ""
[S | Rest] -> (cn S (concat-strings Rest)))
(define join
[] Joiner -> (concat-strings [])
[X] Joiner -> (concat-strings [X])
[X | Y] Joiner -> (concat-strings [X Joiner | (join Y Joiner)])
)
\* string helpers *\