> De: "Sean Corfield" <s...@corfield.org>
> À: "clojure" <clojure@googlegroups.com>
> Envoyé: Jeudi 29 Avril 2021 01:26:34
> Objet: Re: How get function name in body?

> 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.

Instead of using the stacktrace of java.lang.Throwable, you can use 
StackWalker.getCallerClass() if you are using a jdk 9+ 

> 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/ | https://corfield.org/ ]
> World Singles Networks, LLC. -- [ https://worldsinglesnetworks.com/ |
> https://worldsinglesnetworks.com/ ]

> "Perfection is the enemy of the good."
> -- Gustave Flaubert, French realist novelist (1821-1880)

Rémi 

[1] [ 
https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/StackWalker.html#getCallerClass()
 | 
https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/StackWalker.html#getCallerClass()
 ] 

-- 
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/843762456.638578.1619723272421.JavaMail.zimbra%40u-pem.fr.

Reply via email to