From hadley at rice.edu  Fri May 25 15:49:28 2012
From: hadley at rice.edu (Hadley Wickham)
Date: Fri, 25 May 2012 06:49:28 -0700
Subject: [Rd] Curry: proposed new functional programming, er, function.
In-Reply-To: <1337802805327-4631127.post@n4.nabble.com>
References: <7098abec0711011200va3851o811f60bb100616ce@mail.gmail.com>
	<BANLkTi=jud5hhis5y-veQKZHzSYYoPqnBw@mail.gmail.com>
	<79F23BA7BB084E4FA01A8B93904CD02CF669FAA4C9@WIGGUMVS.win.ad.jhu.edu>
	<4DC16917.5090206@gmail.com>
	<BANLkTikuy3OP8j5aymKuE_zmHtYLCkBZWg@mail.gmail.com>
	<79F23BA7BB084E4FA01A8B93904CD02CF669FAA4D7@WIGGUMVS.win.ad.jhu.edu>
	<BANLkTikvfsyZaW4wDB8sA-Z7G-rMQ+11Tg@mail.gmail.com>
	<BANLkTikGcviLYfFska4vkf5GpuCpmKTdJw@mail.gmail.com>
	<BANLkTik-1s+Af541ZkM+mDVkjRx94WM_4w@mail.gmail.com>
	<1337802805327-4631127.post@n4.nabble.com>
Message-ID: <CABdHhvF1zJpDYXo3i7N30r5OQ0_Qj99_Rzpg-2oNRkdDNJFDfw@mail.gmail.com>

> 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).

That's easily fixed:

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


Curry(Curry(foo,3),4)

> 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).

I don't think that would be a good idea - there's a big difference
between a function with no arguments and the result of calling that
function.

Hadley

-- 
Assistant Professor / Dobelman Family Junior Chair
Department of Statistics / Rice University
http://had.co.nz/



[Rd] Curry: proposed new functional programming, er, function.
Hadley Wickham