Here's a fuller example of similar techniques extracted from a working
program. It reads a file of lines and applies some transformations and
accumulates a vector of records which it finally returns;

(defn some-fn
  "Read a file and return a vector of its records."
  [fpath]
  (let
    [r (BufferedReader. (FileReader. (File. fpath)))]
    (try
      (let [line (.readLine r)] ; discard line 1
        (loop [line (.readLine r) recs []]
          (if-not line recs
            (let [rec (do-something-with line)
                  newrecs (conj recs rec)]
              (recur (.readLine r) newrec)))))
      (finally
        (.close r)))))

On Thu, Jun 11, 2009 at 8:48 PM, Adrian
Cuthbertson<adrian.cuthbert...@gmail.com> wrote:
> Re-read your example - that should have been;
>
> (let [updated-val (loop [updateable 0 line (.readline reader)]
>   (if (or (empty? line) (> line-num max-num))
>     (+ updateable (somefunc))
>     (recur (.readLine reader)))))]
>  (do-something-with updated-val))
>
> I.e initialising updateable to 0.
>
>
> On Thu, Jun 11, 2009 at 8:38 PM, Adrian
> Cuthbertson<adrian.cuthbert...@gmail.com> wrote:
>> You could do something like;
>>
>> (let [updated-val (loop [updateable start-value line (.readline reader)]
>>    (if (or (empty? line) (> line-num max-num))
>>      (+ updateable (somefunc))
>>      (recur (.readLine reader)))))]
>>  (do-something with updated-val))
>>
>> Rgds, Adrian.
>>
>> On Thu, Jun 11, 2009 at 8:34 PM, David Nolen<dnolen.li...@gmail.com> wrote:
>>> Why isn't the following satisfactory for your needs? get-value takes a value
>>> returns a new value based on it. do-something can 'do something' to/with
>>> this new value.
>>> (defn get-value [start-value]
>>>   (loop [updateable start-value line (.readline reader)]
>>>     (if (or (empty? line) (> line-num max-num))
>>>       (+ updateable (somefunc))
>>>       (recur (.readLine reader)))))
>>> (defn do-something []
>>>   (let [updated-value (get-value 0)]
>>>      (println updated-value))
>>> On Thu, Jun 11, 2009 at 2:21 PM, Berlin Brown <berlin.br...@gmail.com>
>>> wrote:
>>>>
>>>>
>>>>
>>>> On Jun 11, 12:16 pm, Daniel Lyons <fus...@storytotell.org> wrote:
>>>> > On Jun 11, 2009, at 9:25 AM, BerlinBrown wrote:
>>>> >
>>>> >
>>>> >
>>>> > > I do this a lot but can't figure out to change the UPDATEABLE_VALUE, I
>>>> > > am using some pseudo code because I don't have a clojure solution yet.
>>>> >
>>>> > > SET UPDATEABLE_VALUE = 0
>>>> > > (loop [line (.readLine reader)]
>>>> > >      (if (or (empty? line) (> line-num max-num))
>>>> > >       SET UPDATEABLE_VALUE = UPDATEABLE_VALUE + (SOME_FUNC)
>>>> > >        (recur (.readLine reader))))
>>>> >
>>>> > In general it's going to be something like this:
>>>> >
>>>> > (loop [line (.readLine reader) UPDATEABLE_VALUE 0]
>>>> >       (if (or (empty? line) (> line-num max-num))
>>>> >         (recur (.readLine reader) (+ UPDATEABLE_VALUE (SOME_FUNC)))))
>>>> >
>>>> > Whenever you would have modified a local variable before, in FP you
>>>> > establish a new binding instead.
>>>> >
>>>> > —
>>>> > Daniel Lyonshttp://www.storytotell.org-- Tell It!
>>>>
>>>> I can modify the value within the loop, but what is a good approach
>>>> for accessing the value outside of the loop.  For example (pseudo code
>>>> with a mix of procedural logic).
>>>>
>>>> ;; Init updateable value outside of 'loop'
>>>> SET UPDATEABLE_VALUE = 0
>>>>  (loop [line (.readLine reader)]
>>>>      (if (or (empty? line) (> line-num max-num))
>>>>       SET UPDATEABLE_VALUE = UPDATEABLE_VALUE + (SOME_FUNC)
>>>>        (recur (.readLine reader))))
>>>> ;; Now outside of the loop, use UPDATEABLE_VALUE with the mutated
>>>> value
>>>> (println UPDATEABLE_VALUE)
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>> >>>
>>>
>>
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to