Jestem zdezorientowany, w jaki sposób def i niech różne zmienne wiązania. Czy ktoś może mi wyjaśnić, dlaczego to działa:Rekursja wewnątrz funkcji let
(def leven
(memoize (fn [x y]
(cond (empty? x) (count y)
(empty? y) (count x)
:else (min (+ (leven (rest x) y) 1)
(+ (leven x (rest y)) 1)
(+ (leven (rest x) (rest y)) (if (= (first x) (first y)) 0 1))
)
)))
)
Ale gdy próbuję zadeklarować funkcję niech nie kompilacji:
(def leven
(let [l (memoize (fn [x y]
(cond (empty? x) (count y)
(empty? y) (count x)
:else (min (+ (l (rest x) y) 1)
(+ (l x (rest y)) 1)
(+ (l (rest x) (rest y)) (if (= (first x) (first y)) 0 1))
)
)
))]
(l x y)
)
)
EDIT: To działa, stosując technikę pokazał przez Ankur.
(defn leven [x y]
(let [l (memoize (fn [f x y]
(cond (empty? x) (count y)
(empty? y) (count x)
:else (min (+ (f f (rest x) y) 1)
(+ (f f x (rest y)) 1)
(+ (f f (rest x) (rest y)) (if (= (first x) (first y)) 0 1))
)
)
))
magic (partial l l)]
(magic x y)
)
)
Bardzo interesujące. Więc po prostu przekazujesz funkcję jako argument, więc kompilator nie myli się, ponieważ nie jest zdefiniowany. Nie mogę tego teraz wypróbować, ale spróbuję tego później. – onit