On Fri, May 25, 2012 at 3:14 PM, Yike Lu <yikelu.h...@gmail.com> wrote: > So here's the way I'm reading this: > > Original: > curry_call is the function body you're constructing, which is itself just a > one liner which calls the symbol FUN with the appropriate substitutions.
Yup. With a bit more infrastructure you could probably modify it so that multiple curries collapsed into the equivalent single curry. > call("function", [...]) calls the "function" function, which itself takes 2 > arguments: the list of formal args and the function body. > eval of this call returns the newly constructed function, which you assign > to f. Then you assign the parent.frame() as the environment of f, except > with the symbol FUN assigned as the original argument FUN. > > However, upon looking at the debugger, I find that env$FUN<-FUN assigns FUN > in Global Scope if Curry is called from the top level. > A nested Curry call then creates FUN=function(...) FUN([...]), a recursive > infinite loop. Yes, that was a really bad idea - not sure why I didn't see the problems when I first wrote it. > New: > The recursion is obviously removed now, but what's the new version do? > > As far as I can tell, it returns a structure like... > > function(...){function(...) {original_function_body(curried_arg, ...=...)}} > > Comparing and contrasting to the version in "functional" package: > 1) quotes work (can do Curry(quote(foo), 2) where the "functional" version > can't) > 2) environment capture works in both constructions > 3) Your new version is exceptionally transparent, as the function body gets > stored so that when you print the body later, you can see the original > > As far as 0 argument functions, I understand the difference, that idea came > from a programming language (q/kdb+) I know that supports a neat compact > syntax for this: > > Suppose in R the function was f(x,y,z) x + y + z > > In q, one could do: > f[1;2] // returns the curried form > f[1;2] each (1 2 3 4 5) // equivalent to Map(function(z) f(1,2,z), 1:5) or > Map(Curry(f, 1, 2), 1:5) > f[1;2;3] // returns 6 > f[1;2][3] // returns 6 I can see why that's useful at the language level, but I think it would be confusing to do so in R. Hadley -- Assistant Professor / Dobelman Family Junior Chair Department of Statistics / Rice University http://had.co.nz/ ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel