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.

Reply via email to