[Rd] Contract Syntactic Sugar
ivo welch
ivo.welch at gmail.com
Tue Feb 5 00:22:37 CET 2013
hi brian---interesting and very impressive. is it possible to move
everything into one definition and/or to chain multiple conditions?
exponentiate(x, exponent) %::% data.frame : c(numeric,allpositive) :
integer %as% {
x %has% base ## my invention, since this is not checked, and R is
not strict enough
x$base %::% allpositive
x$base ^ exponent
}
multiple creations as in your doc examples on the same function are a
recipe for errors for me. it's also why I am not too fond of
TypeInfo. chaining conditions in my c() is not important, as long as
I can define my own types (which can check multiple aspects at the
same time). suggestion: in your doc example, can you define a
different type than an integer? it's a little confusing. how about
defining a strictly positive integer?
regards,
/iaw
----
Ivo Welch (ivo.welch at gmail.com)
http://www.ivo-welch.info/
J. Fred Weston Professor of Finance
Anderson School at UCLA, C519
Director, UCLA Anderson Fink Center for Finance and Investments
Free Finance Textbook, http://book.ivo-welch.info/
Editor, Critical Finance Review, http://www.critical-finance-review.org/
On Mon, Feb 4, 2013 at 2:10 PM, Brian Lee Yung Rowe <rowe at muxspace.com> wrote:
> 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