/lib/extend.arc

http://github.com/alimoeeny/arc · Unknown · 76 lines · 73 code · 3 blank · 0 comment · 0 complexity · 0c055178a8165e229ab6105e4a76021f MD5 · raw file

  1. ; extend by CatDancer <cat@catdancer.ws> (http://hacks.catdancer.ws)
  2. ; license: Public domain (http://creativecommons.org/licenses/publicdomain/)
  3. ; CHANGELOG
  4. ; 2010-02-15 Mark Huetsch <markhuetsch@gmail.com>
  5. ; + moved to simpler extend from http://awwx.ws/extend0.arc simply
  6. ; because the old versions don't seem to work with aw's new patches
  7. ; and I don't have time to debug them.
  8. ; 2009-08-20: Michael Arntzenius <daekharel@gmail.com>
  9. ; + reloading the file will no longer wipe the extensions table.
  10. ; + refactored 'extend macro into a function 'extend-add, a function
  11. ; 'extend-fn, a macro 'extend-ensure, and a macro 'extend.
  12. ; + remove unnecessary let in 'extend-wrap's afn
  13. ; + add 'extend-pull fn, 'unextend macro
  14. ;(unless (and bound!extensions* extensions*)
  15. ; (= extensions* (table)))
  16. ;
  17. ;(defmemo extend-fn (name)
  18. ; (fn args
  19. ; ((afn (((label (test func)) . rest))
  20. ; (if (or (no test) (apply test args))
  21. ; (apply func args)
  22. ; (self rest)))
  23. ; (or (extensions* name)
  24. ; (err "no extension defined for" name)))))
  25. ;
  26. ;(mac extend-ensure (name)
  27. ; `(do
  28. ; (unless (extensions* ',name)
  29. ; (= (extensions* ',name) `((original (nil ,,name)))))
  30. ; (= ,name (extend-fn ',name))))
  31. ;
  32. ;(def extend-add (name label test func)
  33. ; (aif (assoc label extensions*.name)
  34. ; (do (prn "*** redefining " name " extension " label)
  35. ; (= (cadr it) (list test func)))
  36. ; (push `(,label (,test ,func)) extensions*.name)))
  37. ;
  38. ;(mac extend (name label test func)
  39. ; `(do1 (extend-ensure ,name)
  40. ; (extend-add ',name ',label ,test ,func)))
  41. ;
  42. ;(def extend-pull (name label)
  43. ; (prn "*** undefining " name " extension " label)
  44. ; (pull [is car._ label] extensions*.name))
  45. ;
  46. ;(mac unextend (name label)
  47. ; `(do (extend-pull ',name ',label) ,name))
  48. ;
  49. ;; original 'extend from extend0.arc
  50. ;(mac extend (name label test func)
  51. ; `(do (unless (extensions* ',name)
  52. ; (= (extensions* ',name) `((original (nil ,,name)))))
  53. ; (aif (assoc ',label (extensions* ',name))
  54. ; (do (prn "*** redefining " ',name " extension " ',label)
  55. ; (= (cadr it) (list ,test ,func)))
  56. ; (push (list ',label (list ,test ,func)) (extensions* ',name)))
  57. ; (= ,name (fn args
  58. ; ((afn (al)
  59. ; (let (label (test func)) (car al)
  60. ; (if (or (no test) (apply test args))
  61. ; (apply func args)
  62. ; (self (cdr al)))))
  63. ; (or (extensions* ',name)
  64. ; (err "no extension defined for" ',name)))))))
  65. ; TODO re-add unextend support
  66. (mac extend (name arglist test . body)
  67. (w/uniq args
  68. `(let orig ,name
  69. (= ,name
  70. (fn ,args
  71. (aif (apply (fn ,arglist ,test) ,args)
  72. (apply (fn ,arglist ,@body) ,args)
  73. (apply orig ,args)))))))