That's a useful tip! Thanks On Monday, May 3, 2021 at 11:21:18 AM UTC-4 noise...@gmail.com wrote:
> there's a handy trick for pulling in the standard repl aliases / refers: > > (cmd)user=> clojure.main/repl-requires > [[clojure.repl :refer (source apropos dir pst doc find-doc)] > [clojure.java.javadoc :refer (javadoc)] [clojure.pprint :refer (pp pprint)]] > (ins)user=> (ns foo.bar) > nil > (ins)foo.bar=> (doc fn) > Syntax error compiling at (REPL:1:1). > Unable to resolve symbol: doc in this context > (ins)foo.bar=> (apply require clojure.main/repl-requires) > nil > (cmd)foo.bar=> (doc fn) > ------------------------- > clojure.core/fn > (fn name? [params*] exprs*) > (fn name? ([params*] exprs*) +) > ([& sigs]) > Special Form > ... > > On Thu, Apr 29, 2021 at 10:41 PM Sean Corfield <se...@corfield.org> wrote: > >> Sorry, it's clojure.repl/demunge so it depends on how you run your REPL >> and evaluate code -- in my case, clojure.repl symbols were all referred in. >> In your case, you'll need to require clojure.repl and refer it in: >> >> (require '[clojure.repl :refer [demunge]) >> >> or make that part of your ns form as: >> >> (:require [clojure.repl :refer [demunge]]) >> >> -- >> 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 Thu, Apr 29, 2021 at 10:27 PM damon kwok <qq563...@gmail.com> wrote: >> >>> >>> 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 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/a3a4a5a8-18e8-4a07-b457-6ed58a75a800n%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/clojure/a3a4a5a8-18e8-4a07-b457-6ed58a75a800n%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 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/CAD4thx_tnaZa5YTdojUojqEQ2ZH4_L478O9iN24MPwhxiMwVLg%40mail.gmail.com >> >> <https://groups.google.com/d/msgid/clojure/CAD4thx_tnaZa5YTdojUojqEQ2ZH4_L478O9iN24MPwhxiMwVLg%40mail.gmail.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/d70dca4f-6df0-4892-bf1c-167b1e88bcc5n%40googlegroups.com.