blob: bba28354b6c10ee4e37b89d35beff33ba610aafd [file] [log] [blame]
swissChili7e1393c2021-07-07 12:59:12 -07001(defun mapcar (fun list)
swissChili484295d2021-07-09 21:25:55 -07002 "Maps over the cars of `list` by running `fun` on each one.
3List must be a cons-list, other sequences are not supported."
swissChili7e1393c2021-07-07 12:59:12 -07004 (if list
5 (cons (funcall fun (car list))
6 (mapcar fun (cdr list)))
7 nil))
swissChili484295d2021-07-09 21:25:55 -07008
9(defun remove-if (predicate list)
10 "Returns a copy of `list` with elements satisfying `predicate`
11removed."
12 (if (not list)
13 nil
14 (if (funcall predicate (car list))
15 (remove-if predicate (cdr list))
16 (cons (car list)
17 (remove-if predicate (cdr list))))))
18
19(defun remove-if-not (predicate list)
20 "Returns a copy of `list` with elements not satisfying `predicate`
21removed."
22 (remove-if (lambda (val)
23 (not (funcall predicate val)))
24 list))
25
26(defun reduce (fun list (initial-value nil))
27 "Combines elements of `list` into one element using `fun`. `fun` must
28accept two arguments and return the result of combining those
29arguments. The first argument will be the result so far and the second
30will be the n-th item of the list. For the first item of the list, the
31result so far will be `initial-value`, or `nil` by default."
swissChili53e7cd12021-08-02 21:55:53 -070032 (if (nilp list)
33 initial-value
34 (reduce fun (cdr list)
35 (funcall fun initial-value
36 (car list)))))
swissChili8b5ec7a2022-08-05 22:26:17 -070037
38(defmacro dolist (bind & body)
39 "(dolist (var list) body ...)"
40 (let ((var (car bind))
41 (list (cadr bind))
42 (rest-sym (gensym)))
43 `(funcall
44 (lambda (,rest-sym)
45 (let ((,var (car ,rest-sym)))
46 (progn ,@body)
47 (if (cdr ,rest-sym)
48 (recurse (cdr ,rest-sym)))))
49 ,list)))