Ostatnio grałem z clojure i doszłam do problemu, którego nie jestem pewien. Mam dawkę z 7 parametrami i rozszerza się do ogromnego bloku, prawie osiągając maksymalny rozmiar klasy. Dlaczego doseq rozszerza się na tak duży blok kodu clojure?Clojure doseq generuje ogromny kod?
Przykład:
(def q '(doseq
[p0 (nth (:params operator) 0 (quote (nil)))
p1 (nth (:params operator) 1 (quote (nil)))
p2 (nth (:params operator) 2 (quote (nil)))
p3 (nth (:params operator) 3 (quote (nil)))
p4 (nth (:params operator) 4 (quote (nil)))
p5 (nth (:params operator) 5 (quote (nil)))
p6 (nth (:params operator) 6 (quote (nil)))]
(do-print board (:oname operator) p0 p1 p2 p3 p4 p5 p6)))
, a następnie:
(macroexpand q)
na moim komputerze to daje ogromny kawałek kodu (97331 bajtów). Czy to normalne, czy też robię coś nie tak? Operator to prosty defragment. Oto link do rozszerzonej rezultacie, jeśli ktoś jest zainteresowany: http://pastebin.com/6gw1q078
edit:
Robiąc to samo, ale z dla postaci otrzymuję coś kilka rzędów wielkości mniejszy (3653 bajtów):
(def q '(for
[p0 (nth (:params operator) 0 (quote (nil)))
p1 (nth (:params operator) 1 (quote (nil)))
p2 (nth (:params operator) 2 (quote (nil)))
p3 (nth (:params operator) 3 (quote (nil)))
p4 (nth (:params operator) 4 (quote (nil)))
p5 (nth (:params operator) 5 (quote (nil)))
p6 (nth (:params operator) 6 (quote (nil)))]
(do-print board (:oname operator) p0 p1 p2 p3 p4 p5 p6)))
(macroexpand q)
wynik jest tutaj: http://pastebin.com/9MAKK3VD
Dlaczego jest taka duża różnica między tymi dwoma? Forma doseq wygląda niewinnie, byłem naprawdę zaskoczony, gdy dostałem komunikat o przekroczeniu rozmiaru klasy java.
Dzięki za wyjaśnienie, myślałem, że to coś w tym stylu. Nadal wydaje się dużym ograniczeniem i zastanawiam się, czy to zamierzone zachowanie ... –