utils.lisp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. ;;;; utils.lisp
  2. (in-package #:list-accumulator)
  3. #| Utility functions for the list-accumulator functions.|#
  4. ;;; Typical named-lambda convention.
  5. ;;; Local def to avoid dependencies.
  6. (defmacro named-lambda (name lambda-list &body body)
  7. "Return a recursive lambda callable from fn-namespace."
  8. `(labels ((,name ,lambda-list ,@body)) #',name))
  9. ;;; Returns a lambda that can recur on self using the
  10. ;;; local macro REC which always refers to the gensym.
  11. ;;; See NAMED-LAMBDA for details on the local macro.
  12. (defmacro genlambda (lambda-list &body body)
  13. "Bind a NAMED-LAMBDA to a GENSYM. Call REC to recur."
  14. (let ((name (gensym)))
  15. `(named-lambda ,name ,lambda-list
  16. (macrolet ((rec (&rest args)
  17. `(,',name ,@args)))
  18. ,@body))))
  19. #| Define Macros to be local to anaphoric-list-accumulator |#
  20. (defvar *macrolets* nil
  21. "Hold macrolets local to ANAPHORIC-LIST-ACCUMULATOR.")
  22. (defvar *symbol-macrolets* nil
  23. "Hold symbol-macrolets local to ANAPHORIC-LIST-ACCUMULATOR.")
  24. (defun pushnews (obj &rest args)
  25. "PUSHNEW all items in ARGS to OBJ."
  26. (dolist (arg args) (pushnew arg obj)))
  27. (defmacro alacc-macrolets (&rest args)
  28. `(lacc::pushnews lacc::*macrolets* ,@args))
  29. (defmacro alacc-symbols (&rest args)
  30. `(lacc::pushnews lacc::*symbol-macrolets* ,@args))
  31. (alacc-macrolets
  32. (operate (fn) `(setf acc (funcall ,fn acc it))))
  33. (alacc-symbols
  34. (op operate)
  35. (increment (incf acc))
  36. (inc increment)
  37. (decrement (decf acc))
  38. (dec decrement)
  39. (collect (push it acc))
  40. (collect-new (pushnew it acc))
  41. (sum (op #'+))
  42. (add sum)
  43. (subtract (op #'-))
  44. (sub subtract)
  45. (multiply (op #'*))
  46. (mult multiply)
  47. (mul multiply)
  48. (divide (op #'/))
  49. (div divide))