control-flow.lisp - clic - Clic is an command line interactive client for gopher written in Common LISP
(HTM) git clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
(DIR) LICENSE
---
control-flow.lisp (1227B)
---
1 (in-package :alexandria-2)
2
3 (defun line-up-iter (thread-first-p acc forms)
4 "Iterative implementation for `thread-iter'.
5
6 The THREAD-FIRST-P decides where to thread the FORMS, accumulating in ACC."
7 (if forms
8 (line-up-iter thread-first-p
9 (let ((form (car forms)))
10 (if (listp form)
11 (if thread-first-p
12 (apply #'list (car form) acc (cdr form))
13 (append form (cons acc nil)))
14 (list form acc)))
15 (cdr forms))
16 acc))
17
18 (defmacro line-up-first (&rest forms)
19 "Lines up FORMS elements as the first argument of their successor.
20 Example:
21
22 (thread-first
23 5
24 (+ 20)
25 /
26 (+ 40))
27
28 is equivalent to:
29
30 (+ (/ (+ 5 20)) 40)
31
32 Note how the single '/ got converted into a list before
33 threading."
34 (line-up-iter t (car forms) (cdr forms)))
35
36 (defmacro line-up-last (&rest forms)
37 "Lines up FORMS elements as the last argument of their successor.
38 Example:
39
40 (thread-last
41 5
42 (+ 20)
43 /
44 (+ 40))
45
46 is equivalent to:
47
48 (+ 40 (/ (+ 20 5)))
49
50 Note how the single '/ got converted into a list before
51 threading."
52 (line-up-iter nil (car forms) (cdr forms)))