[Rd] Contract Syntactic Sugar
Brian Lee Yung Rowe
rowe at muxspace.com
Mon Feb 4 23:10:32 CET 2013
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
More information about the R-devel
mailing list