On 11.05.2009, at 03:00, Rich Hickey wrote: > Could you explain a bit why you needed to do this? I'm a bit concerned > about libraries requiring symbol-macros.
Here is a simplified view of how my monad library works. Each monad is an object that contains the definition of a few functions. Other monadic functions are defined in terms of these basic functions. Monads are applied by surrounding the code depending on the monadic functions by (with-monad m ...) form, which is a macro that expands into (let [m-result ... m-bind ... m-zero ... m-plus ...] ...) The problem now is to define the monadic functions such that they depend on the monad without having it as an explicit argument. My initial solution was to first define a function that takes the four basic functions as explicit arguments: (defn --m-foo-- [m-result m-bind m-zero m-plus x y] (m-plus x y)) and then a macro that provides the desired interface: (defmacro m-foo [x y] (--m-foo-- m-result m-bind m-zero m-plus x y)) This works fine for direct calls to m-foo, but since m-foo is not a proper function, it cannot be passed as an argument to other functions. The current implementation therefore uses symbol macros, (defsymbolmacro m-foo (partial --m-foo-- m-result m-bind m-zero m- plus)) removing all restrictions on the use of monadic functions. My recent exchange with samppi concerns just a small detail: I had forgotten to add symbol macros for the four basic monad functions. Konrad. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---