[Grace-core] Assignment return values and null

Bart Jacobs bart.jacobs at cs.kuleuven.be
Tue Jun 26 04:50:08 PDT 2012


There's a bug in my recurse method. Also, it doesn't allow arguments. 
Better version:

method recurse(body) {
     def iter = { -> body.apply(iter) }
     iter.apply
}

Version with arguments:

method recurse(body) with (*args0) {
     def iter = { *args -> body.apply(iter, *args) }
     iter.apply(*args0)
}

Example:

recurse { me, i ->
     print(i)
     me.apply(i + 1)
} with (0)

or

def fac10 = recurse { me, n -> if (n == 1) then { 1 } else { n * 
me.apply(n - 1) } } with (10)

I'll shut up now...

On 26/06/2012 13:33, Bart Jacobs wrote:
> There's always recursion:
>
> def iter = { ->
>     def line = myfile.getline
>     if (!myfile.eof) {
>         print(line)
>         iter.apply()
>     }
> }
> iter.apply()
>
> Could be made slightly nicer as follows:
>
> recurse { me ->
>     def line = myfile.getline
>     if (!myfile.eof) {
>         print(line)
>         me.apply()
>     }
> }
>
> where
>
> method recurse(body) { body.apply(body) }
>
> Or still nicer perhaps:
>
> loop { break ->
>     def line = myfile.getline; if (myfile.eof) { break.apply() }
>     print(line)
> }
>
> where
>
> method loop(body) {
>     def myBreakException = new Exception
>     try {
>         def break = { -> throw myBreakException }
>         while {true} do {
>             body.apply(break)
>         }
>     } catch { (myBreakException) -> }
> }
>
> On 26/06/2012 12:45, James Noble wrote:
>> Hi Jan
>>
>> that's a good question!
>>
>> In the case of looping over a file, I guess I'd hope for something like
>>
>>> for (myfile.lines) do { line ->
>>>     print (line)
>>> }
>> but that doesn't help the larger problem.
>>
>> I'd have thought the code below could work
>>
>>>   var line
>>>   while { line := myfile.getline; !myfile.eof } do {
>>>       print(line)
>>>   }
>>
>> James
>>
>> On 26/06/2012, at 19:19 PM, Jan Larres wrote:
>>
>>> Hi,
>>>
>>> I just came across a situation that doesn't really have clean solution
>>> in Grace. If you want to read a line from a file and check whether the
>>> end has been reached you can do this in C:
>>>
>>>   while ((read = getline(&line, &len, fp)) != -1) {
>>>       printf("%s", line);
>>>   }
>>>
>>> Or this in Java:
>>>
>>>   while ((line = br.readLine()) != null) {
>>>       System.out.println(line);
>>>   }
>>>
>>> In Grace you can't do it in such a clean way since assignments don't
>>> return their assigned values and there are no nulls. I can think of two
>>> ways to do this currently:
>>>
>>>   while { !myfile.eof } do {
>>>       var line := myfile.getline
>>>       if (!myfile.eof) then {
>>>           print(line)
>>>       }
>>>   }
>>>
>>>   var line := myfile.getline
>>>   while { !myfile.eof } do {
>>>       print(line)
>>>       line := myfile.getline
>>>   }
>>>
>>> but they're both neither really intuitive nor pretty since they require
>>> unnecessary duplication, and the second one is kind of backwards.
>>>
>>> I've also tried this:
>>>
>>>   var line
>>>   while { line := myfile.getline; !myfile.eof } do {
>>>       print(line)
>>>   }
>>>
>>> but that fails with a "use of undefined identifier line" in the print
>>> statement (this may be an implementation issue, I haven't checked yet).
>>>
>>> Is there a specific reason why assignments don't return their value? I
>>> can't see any harm in doing that. The null is of course a more
>>> controversial issue, but at least at the moment there doesn't seem 
>>> to be
>>> a way to implement a getline() method in a way that indicates the 
>>> end of
>>> the file instead of just an empty line.
>>>
>>> Jan
>> _______________________________________________
>> Grace-core mailing list
>> Grace-core at cecs.pdx.edu
>> https://mailhost.cecs.pdx.edu/mailman/listinfo/grace-core
>
>
>
> Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm
> _______________________________________________
> Grace-core mailing list
> Grace-core at cecs.pdx.edu
> https://mailhost.cecs.pdx.edu/mailman/listinfo/grace-core



Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm


More information about the Grace-core mailing list