Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defmacro -> (init &rest funcs)
- (cond
- ((null funcs) `,init)
- ((consp (car funcs))
- (let* ((gensym (gensym))
- (func (recursive-replace '_ `,gensym (car funcs))))
- `(let ((,gensym ,init)) (-> ,func ,@(cdr funcs)))))
- (t `(-> (,(car funcs) ,init) ,@(cdr funcs)))))
- (defun recursive-replace (item replace form)
- (loop for form in form collect
- (if (consp form)
- (recursive-replace item replace form)
- (if (eql form item)
- replace
- form))))
- (labels ((square (x) (* x x)))
- (-> 2 square sqrt))
- -> 2.0
- (-> 2 (* _ _) (sqrt _))
- -> 2.0
- ;; signum returns the sign of the given number
- (-> -3 signum plusp (if _ (print "true")
- (print "false")))
- -> false
- (-> 3 signum plusp (if _ (print "true")
- (print "false")))
- -> true
Advertisement
Add Comment
Please, Sign In to add comment