How to get a value of a var in Java

52 views
Skip to first unread message

ru

unread,
Jun 18, 2021, 6:53:50 AMJun 18
to Clojure
Dear Clojure users and team!
Citation 1 from Clojure documentation:

"Calling Clojure From Java..
IFn plus = Clojure.var("clojure.core", "+"); 
plus.invoke(1, 2);.."

With functions all well but with def..

Citation 2:

"(def symbol doc-stringinit?)

Creates and interns or locates a global var with the name of symbol and a namespace of the value of the current namespace (*ns*). "

I can not figure out how to get the value of the symbol, created with def construct in Clojure and, for example, print it with System.out.println in Java.

I tried everything, nothing works! :(

Any help would be greatly appreciated.

Sincerely,

  Ru






Alex Ott

unread,
Jun 18, 2021, 8:31:03 AMJun 18
to clo...@googlegroups.com

--
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/fcbd3883-705a-4180-9b99-7ccad64a09afn%40googlegroups.com.


--
With best wishes,                    Alex Ott
http://alexott.net/
Twitter: alexott_en (English), alexott (Russian)

ru

unread,
Jun 18, 2021, 9:12:42 AMJun 18
to Clojure
Thanx Alex!

Alas, with defn it works, with def - not! :(

пятница, 18 июня 2021 г. в 15:31:03 UTC+3, Alex Ott:

Chris Nuernberger

unread,
Jun 18, 2021, 9:17:36 AMJun 18
to clo...@googlegroups.com
Vars extend IDeref so one way to get the value of a var is to call .deref on it:

user> (def a)
#'user/a
user> (defn ab [] 1)
#'user/ab
user> (.deref (clojure.lang.RT/var "user" "a"))
2
user> (.deref (clojure.lang.RT/var "user" "ab"))
#function[user/ab]


ru

unread,
Jun 18, 2021, 12:47:57 PMJun 18
to Clojure
Can you please rewrite your example in Java, that I can try it?
By the way, can you give a reference on javadoc in witch IDeref class documented? 
Thanks in advance.

пятница, 18 июня 2021 г. в 16:17:36 UTC+3, ch...@techascent.com:

Gary Verhaegen

unread,
Jun 18, 2021, 1:23:31 PMJun 18
to clo...@googlegroups.com
The official Clojure API for Java is defined here and only supports importing Clojure vars under the IFn interface. In other words, you can only import Clojure functions, not Clojure values, through that API. What you are trying to do is not supported.

That does not mean it's impossible. If you control the Clojure side, the easiest approach is to just make a function and call that through the official API. If for some reason that's not an option, you can try gen-class, which may be faster.

If you can't change the Clojure side, you'll have to use undocumented APIs. The Clojure.var call will return a Var (cast to the IFn interface), which has a deref() method that should get you the underlying value. This is undocumented so it may break and all that, but it really looks like all you need to do is cast that IFn back to a Var (or an IDeref, as Chris suggested).

Overall, I'd strongly recommend going through the documented API and just add a no-arg function.

ru

unread,
Jun 18, 2021, 3:29:51 PMJun 18
to Clojure
Thank you, Gary, for the comprehensive answer. I have a control over Clojure side, so I decide to add special functions to get values of needed vars.
Thanks to all for the help.

Best regards,
  Ru

пятница, 18 июня 2021 г. в 20:23:31 UTC+3, gary.ve...@gmail.com:

Justin Smith

unread,
Jun 24, 2021, 12:43:19 PMJun 24
to Clojure
>  Clojure vars under the IFn interface. In other words, you can only import Clojure functions, not Clojure values, through that API.

Justin Smith

unread,
Jun 24, 2021, 12:43:37 PMJun 24
to Clojure
(sorry, hit reply too soon)

Justin Smith

unread,
Jun 24, 2021, 12:45:38 PMJun 24
to Clojure
anyway - vars implement IFn, as far as I can see there's no real problem here, you can deref the var object and it just happens to also implement IFn

(control-return adds a new line without sending in slack, but sends immediately in gmail, clearly my brain is having trouble code switching here)

Reply all
Reply to author
Forward
0 new messages