Re: How get function name in body?

2021-04-29 Thread Remi Forax
> De: "Sean Corfield" 
> À: "clojure" 
> 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.


Re: How get function name in body?

2021-04-29 Thread 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  wrote:

>
>
> --
>
> *De: *"Sean Corfield" 
> *À: *"clojure" 
> *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 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
> 
> .
>


-- 
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/CAD4thx8qUDQZB%2B9Qbb0RXRYaAV7Q2U_1tExC%2BCjC47RAHgYviA%40mail.gmail.com.


Re: How get function name in body?

2021-04-29 Thread damon kwok

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 写道:

> 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  wrote:
>
>>
>>
>> --
>>
>> *De: *"Sean Corfield" 
>> *À: *"clojure" 
>> *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
>>  
>> 
>> .
>>
>
>
> -- 
> 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.


Re: How get function name in body?

2021-04-29 Thread Sean Corfield
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  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 写道:
>
>> 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  wrote:
>>
>>>
>>>
>>> --
>>>
>>> *De: *"Sean Corfield" 
>>> *À: *"clojure" 
>>> *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
>>> 
>>> .
>>>
>>
>>
>> --
>> 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