Clojure 1.10.1 (defn haha [] (println (demunge (.getName (.getCallerClass (java.lang.StackWalker/getInstance java.lang.StackWalker$Option/RETAIN_CLASS_REFERENCE)))))) Syntax error compiling at (REPL:1:23). Unable to resolve symbol: demunge in this context 在2021年4月30日星期五 UTC+8 上午4:35:45<Sean Corfield> 写道:
> That's definitely nicer: > > dev=> (*defn* *add* [a b] > > #_=> (*println* (demunge (*.getName* (*.getCallerClass* ( > *java.lang.StackWalker*/getInstance *java.lang.StackWalker$Option* > /RETAIN_CLASS_REFERENCE))))) > > #_=> (*+* a b)) > > #'dev/add > > dev=> (add 1 2) > > dev/add > > 3 > > dev=> > > Thanks, Rémi! > > On Thu, Apr 29, 2021 at 12:08 PM Remi Forax <fo...@univ-mlv.fr> wrote: > >> >> >> ------------------------------ >> >> *De: *"Sean Corfield" <se...@corfield.org> >> *À: *"clojure" <clo...@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/ >> World Singles Networks, LLC. -- 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() >> >> -- >> 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 >> --- >> 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. >> > To view this discussion on the web visit >> https://groups.google.com/d/msgid/clojure/843762456.638578.1619723272421.JavaMail.zimbra%40u-pem.fr >> >> <https://groups.google.com/d/msgid/clojure/843762456.638578.1619723272421.JavaMail.zimbra%40u-pem.fr?utm_medium=email&utm_source=footer> >> . >> > > > -- > 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) > -- 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/a3a4a5a8-18e8-4a07-b457-6ed58a75a800n%40googlegroups.com.