www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Cannot Qualify Variadic Functions with Lazy Arguments as nothrow

reply "Per =?UTF-8?B?Tm9yZGzDtnci?= <per.nordlow gmail.com> writes:
At

https://github.com/nordlow/justd/blob/master/algorithm_ex.d#L43

I've implemented a function either() with behaviour similar to 
the `or` function/operator in dynamic languages such as Python 
and Lisp.

I'm almost satisified with it except that the lazy evaluation at

https://github.com/nordlow/justd/blob/master/algorithm_ex.d#L45

cannot be made nothrow.

If I qualify the function as nothrow DMD complains as

algorithm_ex.d(45,16): Error: 'a' is not nothrow
algorithm_ex.d(46,29): Error: '_param_1' is not nothrow

I don't see a reason why any of these two cases should throw.

The same problem occurs if I make the implementation use only one 
function and check the recursion termination case with `static if 
(bs.length == 1)` instead.

Is there a workaround for this?
May 14 2015
next sibling parent reply "Maxim Fomin" <maxim-fomin outlook.com> writes:
On Thursday, 14 May 2015 at 09:53:20 UTC, Per Nordlöw wrote:
 At

 https://github.com/nordlow/justd/blob/master/algorithm_ex.d#L43

 I've implemented a function either() with behaviour similar to 
 the `or` function/operator in dynamic languages such as Python 
 and Lisp.

 I'm almost satisified with it except that the lazy evaluation at

 https://github.com/nordlow/justd/blob/master/algorithm_ex.d#L45

 cannot be made nothrow.

 If I qualify the function as nothrow DMD complains as

 algorithm_ex.d(45,16): Error: 'a' is not nothrow
 algorithm_ex.d(46,29): Error: '_param_1' is not nothrow

 I don't see a reason why any of these two cases should throw.
Lazy argument is essentially delegate/function. Currently there is no way to mark it as nothrow.
 The same problem occurs if I make the implementation use only 
 one function and check the recursion termination case with 
 `static if (bs.length == 1)` instead.

 Is there a workaround for this?
One way to address is to use delegate explicitly. int foo(lazy int a) //nothrow { return a; } int bar(int delegate() nothrow dg) nothrow { return dg(); } void main() nothrow { int a; bar(()=>a); }
May 14 2015
parent "Per =?UTF-8?B?Tm9yZGzDtnci?= <per.nordlow gmail.com> writes:
On Thursday, 14 May 2015 at 10:18:13 UTC, Maxim Fomin wrote:
 On Thursday, 14 May 2015 at 09:53:20 UTC, Per Nordlöw wrote:
 At

 https://github.com/nordlow/justd/blob/master/algorithm_ex.d#L43

 I've implemented a function either() with behaviour similar to 
 the `or` function/operator in dynamic languages such as Python 
 and Lisp.

 I'm almost satisified with it except that the lazy evaluation 
 at

 https://github.com/nordlow/justd/blob/master/algorithm_ex.d#L45

 cannot be made nothrow.

 If I qualify the function as nothrow DMD complains as

 algorithm_ex.d(45,16): Error: 'a' is not nothrow
 algorithm_ex.d(46,29): Error: '_param_1' is not nothrow

 I don't see a reason why any of these two cases should throw.
Lazy argument is essentially delegate/function. Currently there is no way to mark it as nothrow.
 The same problem occurs if I make the implementation use only 
 one function and check the recursion termination case with 
 `static if (bs.length == 1)` instead.

 Is there a workaround for this?
One way to address is to use delegate explicitly. int foo(lazy int a) //nothrow { return a; } int bar(int delegate() nothrow dg) nothrow { return dg(); } void main() nothrow { int a; bar(()=>a); }
That does not feel right at all. D's filosophy is to infer these things.Are you saying that I should create to overloads for the leaf case of either(), namely one that takes a nothrow delegate as argument and another overload that handles the throw case. Further you example functions are not templates. either() must be a template. Could you please show how to modify either() to use your delegate-version instead.
May 14 2015
prev sibling parent "anonymous" <anonymous example.com> writes:
On Thursday, 14 May 2015 at 09:53:20 UTC, Per Nordlöw wrote:
 I'm almost satisified with it except that the lazy evaluation at

 https://github.com/nordlow/justd/blob/master/algorithm_ex.d#L45

 cannot be made nothrow.

 If I qualify the function as nothrow DMD complains as

 algorithm_ex.d(45,16): Error: 'a' is not nothrow
 algorithm_ex.d(46,29): Error: '_param_1' is not nothrow
https://issues.dlang.org/show_bug.cgi?id=12647
May 14 2015