On Aug 8, 2016 1:52 PM, <fah...@gmail.com> wrote:
>
> user> (macroexpand-1 '(defn foo [x] (inc x)))
> (def foo (clojure.core/fn ([x] (inc x))))
>
> If defn is just a macro, then it seems I can do this:
>
> user> (defn bar [] (fn ([x] (inc x))))
> #'user/bar
>
> user> (def foo (bar))
> #'user/foo
>
> user> foo
> #function[user/bar/fn--10778]
>
> But the result is a little different than doing it directly with defn:
>
> user> (defn foo [x] (inc x))
> #'user/foo
>
> We had #'user/bar/fn--10778 vs #'user/foo. But either way, foo is bound
to something.
>
> Is the difference significant? It seems like it is because I tried
something similar in my project and got the following:
>
> IllegalStateException Attempting to call unbound fn:
#'p.core/default-step  clojure.lang.Var$Unbound.throwArity (Var.java:43)
> p.core> default-step
> #function[p.core/make-step/fn--10747]
>
> Function default-step was def'd using make-step which returned a function
and default-step is bound, so why does the repl say it is not?
>
> (defn make-step [some-args]
>   (fn ([other-args]
>        (some-body using-both-args))))
>
> Basically I need to define a bunch of similar functions and am trying to
use another function to help define them (instead of using a macro). But it
seems I'm doing something wrong...
>

Use the source, Luke!

Spend some quality time with the source code of deftype, defrecord, ns,
etc. and you will not regret it.  Monkey with the ns- functions to explore
namespaces, interning, etc.  Make sure you grok the relation between vars
and values. Once you get the hang of how Clojure does it you'll find it
easy to roll your own.

You will almost certainly want to use some macros, but what's wrong with
that?

gregg

-- 
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/d/optout.

Reply via email to