I agree! :)

On Fri, Aug 9, 2013 at 10:10 AM, Mikera <mike.r.anderson...@gmail.com>wrote:

> On Friday, 9 August 2013 05:07:10 UTC+8, Jonathan Fischer Friberg wrote:
>
>> I'd suggest avoiding macros until you absolutely know that you need them.
>> Usually they aren't necessary.
>>
>>
>> Problem with this is that you don't really know when you need them unless
>> you know what they do.
>>
>
> I'm not saying "don't learn how macros work". Learning is always good.
>
> My recommendation is just that your default approach should be to avoid
> using them unless you have tried very hard to achieve your goal with pure
> functions first, and convinced yourself that it isn't possible.
>
> Macros are only *needed* IMHO when one of the following applies:
> - You want to create new language/DSL syntax that isn't expressible with
> normal function application rules (e.g. short-circuiting evaluation, new
> control structures etc.)
> - You need to do custom code generation at compile time for some good
> reason (e.g. performance, since macros enable you to do compile-time
> specialisation of code)
>
> I wrote about these and gave some examples in a blog post a few months
> back for anyone interested:
>
> http://clojurefun.wordpress.com/2013/01/09/when-do-you-need-macros-in-clojure/
>
>
>
>
>>
>> On Thu, Aug 8, 2013 at 9:58 PM, Jace Bennett <jace.b...@gmail.com> wrote:
>>
>>> Thanks, Mike.
>>>
>>> I guess my simple example is too simple. Out of the hypothetical, have
>>> you used techniques like this?
>>>
>>> I have this nagging feeling that there is a more direct and idiomatic
>>> way to glean this sort of information from my code. I mean, that's why we
>>> use AST's, right? So we can process them? I shouldn't need a data structure
>>> like the endpoint map in the first place. I just don't know how to
>>> capitalize on this rather abstract and vague notion.
>>>
>>> How do folks usually go about it when they have a desire to query the
>>> running system about its shape and structure?
>>>
>>>
>>>
>>> On Thu, Aug 8, 2013 at 2:36 AM, Mikera <mike.r.an...@gmail.com> wrote:
>>>
>>>> I'd suggest avoiding macros until you absolutely know that you need
>>>> them. Usually they aren't necessary.
>>>>
>>>> Prefer writing pure functions (without side effects) - these are easier
>>>> to reason about, easier to test, simpler to write correctly and easier to
>>>> plug together / compose via higher order functions.
>>>>
>>>> For example, in your endpoint example I would probably just use three
>>>> functions:
>>>> - a pure "add endpoint metadata to an endpoint map" function
>>>> - an impure "update endpoints" function that updates endpoints using an
>>>> endpoint map
>>>> - a function that calls both of the above to declare and launch a new
>>>> endpoint
>>>>
>>>> There might be a few other helper functions as well but hopefully you
>>>> get the idea.
>>>>
>>>>
>>>> On Thursday, 8 August 2013 03:19:15 UTC+1, Jace Bennett wrote:
>>>>>
>>>>> Thanks to the community for a wondrous programming environment. I
>>>>> discovered SICP last year, and fell in love with the idea of lisp. But 
>>>>> I've
>>>>> come to a point where I think I need practice on moderately sized projects
>>>>> before more reading will help.
>>>>>
>>>>> When starting on almost any moderately scoped effort, I quickly run
>>>>> into a class of problems which I think may be a fit for macros, but I want
>>>>> to understand what is the idiomatic way to approach them in clojure.
>>>>>
>>>>> Most of my professional experience is in .NET, and that is probably
>>>>> coloring my thought patterns a bit. In that context, I often use 
>>>>> reflection
>>>>> scans and type metadata to configure infrastructural bits and dry things
>>>>> up. Instead of having to explicitly register components in the more 
>>>>> dynamic
>>>>> areas of my app, I use conventions to select components to register from
>>>>> the metadata I have about my code.
>>>>>
>>>>> I can imagine using macros in clojure to accumulate metadata about my
>>>>> declarations so that I can query them at runtime. For example, maybe a
>>>>> "defendpoint" macro that sets up a handler AND adds it to the routing 
>>>>> table
>>>>> (or more directly an "endpoint map" which I then use to make routing
>>>>> decisions among other things).
>>>>>
>>>>> Admittedly, something about the sound of the phrase "it's just data"
>>>>> tells me I'm sniffin up the wrong tree here. But I don't know how to turn
>>>>> that nagging feeling into working code.
>>>>>
>>>>> Is this a reasonable use of the macro? What about doing the
>>>>> registration at macro-expansion time vs emitting runtime code to do it? 
>>>>> How
>>>>> should one approach the problems space otherwise?
>>>>>
>>>>>  Thanks for your time.
>>>>>
>>>>  --
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Clojure" group.
>>>> To post to this group, send email to clo...@googlegroups.com
>>>>
>>>> Note that posts from new members are moderated - please be patient with
>>>> your first post.
>>>> To unsubscribe from this group, send email to
>>>> clojure+u...@**googlegroups.com
>>>>
>>>> For more options, visit this group at
>>>> http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en>
>>>> ---
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Clojure" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to clojure+u...@**googlegroups.com.
>>>>
>>>> For more options, visit 
>>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>
>>>> .
>>>>
>>>>
>>>>
>>>
>>>  --
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To post to this group, send email to clo...@googlegroups.com
>>>
>>> Note that posts from new members are moderated - please be patient with
>>> your first post.
>>> To unsubscribe from this group, send email to
>>> clojure+u...@**googlegroups.com
>>>
>>> For more options, visit this group at
>>> http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en>
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to clojure+u...@**googlegroups.com.
>>>
>>> For more options, visit 
>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>
>>> .
>>>
>>
>>  --
> --
> 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
> Note that posts from new members are moderated - please be patient with
> your first post.
> 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
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>

-- 
-- 
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
Note that posts from new members are moderated - please be patient with your 
first post.
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to