[Rd] Curry: proposed new functional programming, er, function.
Yike Lu
yikelu.home at gmail.com
Wed May 23 21:53:25 CEST 2012
Hadley Wickham-2 wrote
>
> Curry <- function(FUN, ...) {
> args <- match.call(expand.dots = FALSE)$...
> args$... <- as.name("...")
>
> env <- parent.frame()
>
> if (is.name(FUN)) {
> fname <- FUN
> } else if (is.character(FUN)) {
> fname <- as.name(FUN)
> } else if (is.function(FUN)){
> fname <- as.name("FUN")
> env$FUN <- FUN
> } else {
> stop("FUN not function or name of function")
> }
> curry_call <- as.call(c(list(fname), args))
>
> f <- eval(call("function", as.pairlist(alist(... = )), curry_call))
> environment(f) <- env
> f
> }
>
> But I've probably forgotten something else. Hopefully Luke will chime
> in if I'm proceeding down a path that can never be made to work
> completely correctly.
>
I've been playing around with this for a while. One flaw I found - it
doesn't handle nested Curries very well (the naive implementation in
roxygen/functional does).
e.g.:
foo=function(x,y,z) x+y+z
Curry(Curry("foo",3),4)(3)
# 10
Curry(Curry(foo,3),4)(3)
# hangs
foo4=function(a,b,c,d)
Curry(Curry(Curry("foo4",3),4),1)(3)
# hangs
I was also curious if there was some trick to force a function eval when the
list of arguments got exhausted (for example, a triple Curry on foo above
would leave no arguments so would trigger eval into 10).
--
View this message in context: http://r.789695.n4.nabble.com/Curry-proposed-new-functional-programming-er-function-tp917654p4631127.html
Sent from the R devel mailing list archive at Nabble.com.
More information about the R-devel
mailing list