How get function name in body?

2021-04-28 Thread damon kwok

How get function name in body?

(defn add [a b]
 ;; how get "add" here?
  (+ a b))

-- 
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/5c533ccf-ec0b-4c84-b759-851f1fe3b3can%40googlegroups.com.


Re: How get function name in body?

2021-04-28 Thread Blake Watson
Well, it seems like it should be possible. At the end of the defn macro,
metadata is attached to a function, so you can see the name with:

```
(meta #'my.ns/add)
```

And you could do this inside the function:

```
(defn add [a b]
  (let [name (:name (meta #'add))]
(str a b name)))
```

But that can't be what you want. The thing is, the actual function body
doesn't know that it's being bound to the symbol "add" and making it aware
would seem to contravene a number of league bylaws.

That is to say, the macro "defn" attaches the meta-information to the
symbol #add, not to the code that follows.

You could certainly make your own macro to make the bound variable name
visible to the body of the code, but I'm not sure you can do that with the
built-in defn.

-- 
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/CAJAnwPmWK82nS1udL7MvVeDpa1rQHQ3c34G37WWasm%3D7DieroA%40mail.gmail.com.


Re: How get function name in body?

2021-04-28 Thread Sean Corfield
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.

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)
On Wed, Apr 28, 2021 at 6:35 AM damon kwok  wrote:

>
> How get function name in body?
>
> (defn add [a b]
>  ;; how get "add" here?
>   (+ a b))
>
> --
> 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/5c533ccf-ec0b-4c84-b759-851f1fe3b3can%40googlegroups.com
> 
> .
>

-- 
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/CAD4thx93gtbitV20HNk9XBGF%2BkoDyCLYadNp32dvrOSQdpRN0w%40mail.gmail.com.