Один из вариантов - использовать тот же подход, который вы использовали с функцией, которую вы передаете repeatedly
: просто оберните выражения в функции, которые не принимают аргументов (или только те аргументы, которые вы хотите изменить), тогда они будутоценивать каждый раз, когда вы вызываете функцию.
(let [rand-coord (fn [] (randomNormal 0.1 0.9)) ;; or #(randomNormal 0.1 0.9)
make-dab #(make-watercolor (mkpt (rand-coord) (rand-coord))
(w (randomNormal 0.4 0.7)))
dabs (take 10 (repeatedly make-dab))]
(draw-multiple-watercolor dabs 3))
Также обратите внимание на letfn
для определения функций в области не верхнего уровня / пространства имен.
Вы также можете найти Threading макросы, такие как ->
, ->>
, as->
, some->
, cond->
и т. Д., Могут сделать некоторый код более читабельным.Например, если вы изменили draw-multiple-watercolor
, чтобы взять его последовательность мазков last (что является довольно распространенной практикой для функций, работающих с последовательностями в Clojure), то вы можете сделать что-то вроде этого:
(let [rand-coord (fn [] (randomNormal 0.1 0.9)) ;; or #(randomNormal 0.1 0.9)
make-dab #(make-watercolor (mkpt (rand-coord) (rand-coord))
(w (randomNormal 0.4 0.7)))]
(->> make-dab
(repeatedly 10) ;; note: repeatedly can take a # of iterations
(draw-multiple-watercolor 3)))