Guest User

thread/postfix macro

a guest
Feb 26th, 2013
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 0.88 KB | None | 0 0
  1. (defmacro -> (init &rest funcs)
  2.   (cond
  3.     ((null funcs) `,init)
  4.     ((consp (car funcs))
  5.      (let* ((gensym (gensym))
  6.             (func (recursive-replace '_ `,gensym (car funcs))))
  7.        `(let ((,gensym ,init)) (-> ,func ,@(cdr funcs)))))
  8.      (t `(-> (,(car funcs) ,init) ,@(cdr funcs)))))
  9.  
  10. (defun recursive-replace (item replace form)
  11.   (loop for form in form collect
  12.        (if (consp form)
  13.            (recursive-replace item replace form)
  14.            (if (eql form item)
  15.                replace
  16.                form))))
  17.  
  18.  
  19. (labels ((square (x) (* x x)))
  20.    (-> 2 square sqrt))
  21.  
  22. -> 2.0
  23.  
  24. (-> 2 (* _ _) (sqrt _))
  25.  
  26. -> 2.0
  27.  
  28. ;; signum returns the sign of the given number
  29. (-> -3 signum plusp (if _ (print "true")
  30.                           (print "false")))
  31.  
  32. -> false
  33.  
  34. (-> 3 signum plusp (if _ (print "true")
  35.                          (print "false")))
  36.  
  37. -> true
Advertisement
Add Comment
Please, Sign In to add comment