View difference between Paste ID: 3MQd79ej and vPBp2BKj
SHOW: | | - or go back to the newest paste.
1
(defmacro -> (init &rest funcs)
2
  (cond
3
    ((null funcs) `,init)
4
    ((eql 'if (car funcs)) `(-> (if ,init ,(cadr funcs) ,(caddr funcs)) ,@(cdddr funcs)))
5
    ((consp (car funcs))
6
     (let* ((gensym (gensym))
7
            (func (recursive-replace '_ `,gensym (car funcs))))
8
       `(let ((,gensym ,init)) (-> ,func ,@(cdr funcs)))))
9
     (t `(-> (,(car funcs) ,init) ,@(cdr funcs)))))
10
 
11
(defun recursive-replace (item replace form)
12
  (loop for form in form collect
13
       (if (consp form)
14
           (recursive-replace item replace form)
15
           (if (eql form item)
16
               replace
17
               form))))
18
19
20
(labels ((square (x) (* x x)))
21
   (-> 2 square sqrt))
22
23
-> 2.0
24
25
(-> 2 (* _ _) (sqrt _))
26
27
-> 2.0
28
29
;; signum returns the sign of the given number
30
(-> -3 signum plusp (if _ (print "true")
31
                          (print "false")))
32
33
-> false
34
35
(-> 3 signum plusp (if _ (print "true")
36
                         (print "false")))
37-
-> true
37+
38
-> true
39
40
41
;; I also just added support for a more forth-style conditional
42
43
(-> 3 signum plusp if (print "true") (print "false"))
44
45
-> "true"
46
47
(-> -3 signum plusp if (print "true") (print "false"))
48
49
-> "false"