From rowe at muxspace.com  Mon Feb  4 23:10:32 2013
From: rowe at muxspace.com (Brian Lee Yung Rowe)
Date: Mon, 4 Feb 2013 17:10:32 -0500
Subject: [Rd] Contract Syntactic Sugar
In-Reply-To: <CAPr7RtX787PFPCYtqPROOnUSSgdSyPq9dq7yTF780q4syEA1jw@mail.gmail.com>
References: <CAPr7RtX787PFPCYtqPROOnUSSgdSyPq9dq7yTF780q4syEA1jw@mail.gmail.com>
Message-ID: <489BC778-DB7A-46CD-9574-089B69D9D068@muxspace.com>

Ivo, 

You might be interested in my lambda.r package which provides syntax (using the %::% operator) for type constraints. Given a function with n arguments, the type constraint requires n + 1 types, as the last type listed is the return type. Lambda.r also provides syntax for specifying any arbitrary condition on the input arguments via the %when% operator. For your example below you could do the following:

exponentiate(x, exponent) %::% data.frame : numeric : numeric
exponentiate(x, exponent) %when% {
  is.positive(x)
} %as% {
  x$base ^ exponent 
}

You can see more examples in the package (available on CRAN) or in the source (https://github.com/muxspace/lambda.r).

HTH,
Brian


On Feb 4, 2013, at 4:53 PM, ivo welch <ivo.welch at anderson.ucla.edu> wrote:

> ## the following is a dream: add some sugar syntax to allow for
> contracts with teeth (in and out checking)
> 
>> is.positive <- function(x) (all(x>0))
> 
>> exponentiate <- function( x ::is.data.frame , exponent ::is.numeric is.positive)  :: is.vector is.numeric  {
>    x$base :: is.positive        ## error also if base does not exist
> in x; may need some special IQ
>    x$base^exponent
> }
> 
> should be self-explanatory.  anything that has '::' means "run what is
> before through all the functions after and barf if it is not true".
> any other operator rather than :: or other syntax would be as
> good---this is just illustratory.  in the end, this code should be
> viewed by R as the same as
> 
>> exponentiate <- function( x, exponent ) {
>    stopifnot( is.data.frame(x) )
>    stopifnot( is.numeric(exponent) )
>    stopifnot( is.positive(exponent) )
>    stopifnot( exists("base", "x") )
>    stopifnot( is.positive( x$base ) )
>    return.value <- x$base^exponent
>    stopifnot( is.vector(return.value) )
>    stopifnot( is.numeric(return.value) )
>    return.value
> }
> 
> is this a feasible summer project for a student with a prospect of
> inclusion of the completed code in the R core language itself if I pay
> for the development time?  {or does better syntax already exist and I
> am just ignorant (which I often am)?}
> 
> regards,
> 
> /iaw
> ----
> Ivo Welch (ivo.welch at gmail.com)
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] Contract Syntactic Sugar
Brian Lee Yung Rowe