Hi Christian,

You are right, I left out the @result. (So far I haven't yet needed  
the value so I don't have a test for that scenario. Classic case of  
over-documenting.)

I will take the double-check out. Not only is its value limited, its  
confusion potential is high.

Stuart

> "All other invocations return the first calculated value."
>
> I fail to spot the part of your function where you keep this promise.
> From what I can tell, your function would return nil on all but the
> first invocation.
>
> I think you forgot to write "@result" in the else case in your last  
> if clause.
>
> On Mon, Jan 26, 2009 at 9:32 PM, Stuart Halloway
> <[email protected]> wrote:
>>
>> Lancet's runonce function needs to wrap a function with runs-only- 
>> once
>> semantics, *and* make subsequent callers wait for the return value
>> before proceeding. There was a thread on this last November where  
>> Rich
>> explained several approaches 
>> (http://groups.google.com/group/clojure/msg/406be93eb0a226aa
>> ).
>>
>> None of those approaches quite fit what Lancet needs. However, this
>> locking approach works (I think):
>>
>> (defn runonce
>> "Create a function that will only run once. All other invocations
>> return the first calculated value. The function *can* have side
>> effects,
>> and calls to runonce *can* be composed. Deadlock is possible
>> if you have circular dependencies.
>> Returns a [has-run-predicate, reset-fn, once-fn]"
>> [function]
>> (let [sentinel (Object.)
>>       result (atom sentinel)
>>       reset-fn (fn [] (reset! result sentinel))
>>       has-run-fn (fn [] (not= @result sentinel))]
>>   [has-run-fn
>>    reset-fn
>>    (fn [& args]
>>      (if (= @result sentinel)
>>        (locking sentinel
>>          (if (= @result sentinel)
>>            (reset! result (function))))))]))
>>
>> Is this an example where locking is reasonable, or is there a better
>> Clojurish way?
>
> Your problem is inherently dealing with mutual exclusion. I think
> locking is appropriate.
>
> However, I think your double-check scheme, while safe, is of limited
> value. Uncontended locks, as would be the case in lancet, are pretty
> cheap.
>
>>
>> Stuart
>>
>>>
>>
>
>
>
> -- 
> Venlig hilsen / Kind regards,
> Christian Vest Hansen.
>
> >


--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to