Consider that:
(defn add [a b] (+ a b))
is expanded to (something like):
(def add (fn [a b] (+ a b)))
So the actual code that runs is an anonymous function, which is bound to
the (global) var #'add -- the function itself has no name.
dev=> (*macroexpand* '(*defn* *add* [a b] (*+* a b)))
(def add (clojure.core/fn ([a b] (+ a b))))
dev=> (*defn* *add* [a b] (*+* a b))
#'dev/add
dev=> add
#object[dev$add 0x72f91c91 "dev$add@72f91c91"]
So the value of add is an object, with type dev$add, a class that
implements a bunch of things including clojure.lang.IFn and
java.lang.Runnable and java.util.concurrent.Callable etc.
The "name" of function is hard to get to, inside a function because of that.
One way to figure that out at runtime is to dig into the stack, which you
can get at by creating an exception and inspecting it: be aware that this
is an expensive operation!
dev=> (*defn* *add* [a b]
#_=> (*let* [frame (*first* (*:trace* (*Throwable->map* (*ex-info* *""*
{}))))]
#_=> (*println* (demunge (*name* (*first* frame))))
#_=> (*+* a b)))
#'dev/add
dev=> (add 1 2)
dev/add
3
dev=>
demunge is what turns Clojure's generated classnames back into readable
source names.
The more important question is: why do you want the function's name inside
the body?
--
Sean A Corfield -- (904) 302-SEAN
An Architect's View -- https://corfield.org/
World Singles Networks, LLC. -- https://worldsinglesnetworks.com/
"Perfection is the enemy of the good."
-- Gustave Flaubert, French realist novelist (1821-1880)
On Wed, Apr 28, 2021 at 6:35 AM damon kwok <qq563066...@gmail.com> wrote:
>
> How get function name in body?
>
> (defn add [a b]
> ;; how get "add" here?
> (+ a b))
>
> --
> 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.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/clojure/5c533ccf-ec0b-4c84-b759-851f1fe3b3can%40googlegroups.com
> <https://groups.google.com/d/msgid/clojure/5c533ccf-ec0b-4c84-b759-851f1fe3b3can%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
--
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.
To view this discussion on the web visit
https://groups.google.com/d/msgid/clojure/CAD4thx93gtbitV20HNk9XBGF%2BkoDyCLYadNp32dvrOSQdpRN0w%40mail.gmail.com.