I have some mutually recursive code as follows:
(ns tester.core
(:require [clojure.data.json :as json])
(:gen-class))
(defn getValuePathPairs
[json]
(cond
(instance? clojure.lang.PersistentVector json) (getVectorValuePathPairs
json)
(instance? clojure.lang.PersistentArrayMap json) (getMapValuePathPairs
json)
(instance? Boolean json) [[json ""]]
(instance? Number json) [[json ""]]
(instance? String json) [[json ""]])
)
(defn getVectorValuePathPairs
[vec]
(mapcat (fn [[i e]]
(for [[leaf-value path] (getValuePathPairs e)]
[leaf-value (str "[" i "]" path)]))
(map-indexed vector vec))
)
(defn getMapValuePathPairs
[m]
(mapcat (fn [[k v]]
(for [[leaf-value path] (getValuePathPairs v)]
[leaf-value (str "[" k "]" path)]))
m)
)
(defn -main
"I don't do a whole lot ... yet."
[& args]
(println (getValuePathPairs ["Blah" 1 true])))
getValuePathPairs calls getVectorValuePathPairs and getMapValuePathPairs,
which in turn call getValuePathPairs. When I try to compile and run this
code I get the following error:
Exception in thread "main" java.lang.RuntimeException: Unable to resolve
symbol: getVectorValuePathPairs in this context,
compiling:(tester/core.clj:8:52)
It appears from my experimentation that the issue is that when compiling
getValuePathPairs,
the function getVectorValuePathPairs isn't yet defined, as when I compile
this into a CIDER repl with the recursion taken out, then compiled again
with it put back it runs just fine.
Googling about mutual recursion in clojure provides a lot of hits about
lack of tail call optimization, but no one saying that it's impossible to
do (given short recursive depths). In this particular piece of code, I
could just inline the two inner functions, but I'd be giving up a lot of
readability. Is there a way to compile mutually recursive code? If not,
is there a good way to structure this sort of code so I can pull out small
functions and name them without running into this problem?
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.