Hello, On Mon, Nov 2, 2009 at 4:30 PM, dmiller <dmiller2...@gmail.com> wrote: > For ref & out parameters, the problem is that let bindings and fn > parameters are not variables. You can't change the values they are > bound to. ref and out change the values bound to the variables passed > as parameters. > > So if we implement ref/out silently, > > (let [ a nil ] ... (DateTime.TryParse "2009/10/20" a) ... ) > > where subsequent to the call the value bound to a has changed, then > we've just changed Clojure semantics non-trivially.
I agree, changing let/fn bindings would be simply terrible. I thought a little about a solution, and the only decent alternative I see is treating out/ref as a clumsy syntax for returning a vector/list. So my suggestion would be that methods with out/ref return a list of results instead of just the result returned by the .NET method. The list would have the value returned by the method as the first parameter, and the out/ref values as the rest of the elements, in the order they appear in the parameter list. So TryParse could be called as: (let [[valid date] (DateTime/TryParse "2009/10/20" nil)] ... check 'valid', do something with 'date') I bet this simple solution has plenty of warts :-p For instance, we still need to pass the out/refs as arguments because they are in fact input/output arguments. The solution right now (without any CLR interop changes) would be to wrap the out/ref calls in methods without out/ref in C#, which is kind of painful... Implementing the 'return a list' suggestion above would in fact automate writing such wrappers by asking the Clojure compiler/runtime to generate that code. I hope there are better ways to handle ref/outs:-) -- Miron Brezuleanu --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---