我試圖從嵌套數據結構獲取值的索引路由。如何在Clojure中深度嵌套的數據結構(向量和列表)中找到索引?
我已經寫了一些代碼,但它不能正常工作
(defn helper
[val form c index]
(loop [f form
i index
l 0]
(if (seq f)
(if (or (list? (first f)) (vector? (first f)))
(helper val (first f) (conj c l) (inc i))
(if (= val (first f))
(conj c l)
(recur (rest f) (inc i) (inc l))))
nil)))
(defn find-indexes
[val form c index]
(when (seq form)
(if-let [result (helper val form c index)]
result
(find-indexes val (rest form) c (inc index)))))
(defn find-index-route
[val form]
(find-indexes val form [] 0))
當前的行爲:
(find-index-route :my-key '(1 2 ("a" :my-key))) ;=> [2 1] "Works"
(find-index-route :my-key '(1 2 ("a" ["b" 3 :my-key]))) ;=> [2 1 2] "Works"
(find-index-route :my-key '(1 2 ("a" ["b" 3() :my-key]))) ;=> nil "Does NOT Work"
(find-index-route :my-key '(1 2 ("a" [] ["b" 3 :my-key]))) ;=> nil "Does NOT Work"
(find-index-route :my-key '(1 2 [] ("a" ["b" 3 :my-key]))) ;=> [0 1 2] "It has to be [3 1 2]"
的事情是,如果函數命中空列表或載體找到前值它返回零或0(僅用於第一級)
The be haviour我需要:
;=> [indexes...]
(find-index-route :my-key '(1 2 :my-key)) ;=> [2]
(find-index-route :my-key '(1 2 "a" :my-key "b")) ;=> [3]
(find-index-route :my-key '(1 2 [:my-key] "c")) ;=> [2 0]
(find-index-route :my-key '(1 2 [3 [:my-key]])) ;=> [2 1 0]
(find-index-route :my-key '(1 2 [3 [[] :my-key]])) ;=> [2 1 1]
(find-index-route :my-key '(1 2 [3 [4 5 6 (:my-key)]])) ;=> [2 1 3 0]
(find-index-route :my-key '(1 2 [3 [[]]])) ;=> nil or []
這是什麼問題問?什麼是「指標路線」?爲什麼':我的'特別?你輸入的結構是什麼?你的預期產出是什麼意思?正如所寫的,這個問題是無法回答的。 – amalloy
@amalloy編輯的問題,現在更清楚了嗎? –
請包括您嘗試的實際代碼。 '...'並不能讓我們確信*你自己試過*任何事情。 –