> De: "Sean Corfield" <[email protected]>
> À: "clojure" <[email protected]>
> 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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/clojure/843762456.638578.1619723272421.JavaMail.zimbra%40u-pem.fr.