Thanks Konrad I do not understand the benefit of storing the map-board result. The map-board function it self is using lazy for loop. Why isn't the laziness transitive automatically?
On Jan 11, 12:05 pm, Konrad Hinsen <[email protected]> wrote: > On 11.01.2009, at 08:56,Tzachwrote: > > > Following your good advice, I also update the next-cell function to > > work in a lazy way instead of sorting the values of the entire board. > > Good idea! > > > (defn next-cell [board] > > "return the next potential cell to set, and the valid alternatives" > > (first (for [n (range 1 10)] > > (filter > > #(= n (count (second %))) > > (map-board board valid-values))))) > > Your implementation has the disadvantage of recomputing (map- > board ...) nine times. You can avoid this with a simple modification: > > (defn next-cell [board] > "return the next potential cell to set, and the valid alternatives" > (let [vv (map-board board valid-values)] > (first (for [n (range 1 10)] > (filter > #(= n (count (second %))) > vv))))) > > Since the values of the lazy sequence vv are cached, nothing will > ever be recomputed. > > However, I think there is also a bug in your function: (first > (for ..)) will return the result of the first iteration of the for, > even if it is emtpy. What you want is the first element of the first > non-empty element of the for sequence. You can get this with (first > (apply concat (for [n ...))). Concat again creates a lazy sequence, > so nothing is computed unless necessary. > > Konrad. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to [email protected] 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 -~----------~----~----~----~------~----~------~--~---
