Thread overview | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
November 19, 2020 betterC question | ||||
---|---|---|---|---|
| ||||
I have simple test program: import core.stdc.stdio : printf; void test() { int* a; printf("a == null %d\n", a == null); } int function() fp = test; extern (C) void main() { fp(); } Why do I get: \d\dmd-2.092.1\windows\bin64\dmd.exe -betterC tests.d tests.d(5): Error: printf cannot be interpreted at compile time, because it has no available source code This is on Windows |
November 19, 2020 Re: betterC question | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dibyendu Majumdar | On Thursday, 19 November 2020 at 00:07:12 UTC, Dibyendu Majumdar wrote:
> int function() fp = test;
This tries to *call* the function test and assign its return value to fp.
You want &test to get the address.
|
November 19, 2020 Re: betterC question | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On Thursday, 19 November 2020 at 00:08:59 UTC, Adam D. Ruppe wrote: > On Thursday, 19 November 2020 at 00:07:12 UTC, Dibyendu Majumdar wrote: >> int function() fp = test; > > This tries to *call* the function test and assign its return value to fp. > Really? why does it do that? > You want &test to get the address. |
November 19, 2020 Re: betterC question | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On Thursday, 19 November 2020 at 00:08:59 UTC, Adam D. Ruppe wrote:
> On Thursday, 19 November 2020 at 00:07:12 UTC, Dibyendu Majumdar wrote:
>> int function() fp = test;
>
> You want &test to get the address.
Okay that works. Thanks
|
November 19, 2020 Re: betterC question | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dibyendu Majumdar | On 19/11/2020 1:11 PM, Dibyendu Majumdar wrote:
> On Thursday, 19 November 2020 at 00:08:59 UTC, Adam D. Ruppe wrote:
>> On Thursday, 19 November 2020 at 00:07:12 UTC, Dibyendu Majumdar wrote:
>>> int function() fp = test;
>>
>> This tries to *call* the function test and assign its return value to fp.
>>
>
> Really? why does it do that?
You don't need the brackets to call a function (and with a little help from UFCS):
void main() {
import std.stdio;
"Hello!".writeln;
writeln;
}
|
November 19, 2020 Re: betterC question | ||||
---|---|---|---|---|
| ||||
Posted in reply to rikki cattermole | On Thursday, 19 November 2020 at 00:18:54 UTC, rikki cattermole wrote:
>
> You don't need the brackets to call a function (and with a little help from UFCS):
>
> void main() {
> import std.stdio;
>
> "Hello!".writeln;
> writeln;
> }
Okay thanks. Bad idea IMO.
|
November 19, 2020 Re: betterC question | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dibyendu Majumdar | On Thursday, 19 November 2020 at 00:20:50 UTC, Dibyendu Majumdar wrote:
> On Thursday, 19 November 2020 at 00:18:54 UTC, rikki cattermole wrote:
>
>>
>> You don't need the brackets to call a function (and with a little help from UFCS):
>>
>> void main() {
>> import std.stdio;
>>
>> "Hello!".writeln;
>> writeln;
>> }
>
> Okay thanks. Bad idea IMO.
Imagine what range pipelines would look like without it. This is one of my favorite D features.
|
November 19, 2020 Re: betterC question | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dibyendu Majumdar | On Thursday, 19 November 2020 at 00:20:50 UTC, Dibyendu Majumdar wrote: > On Thursday, 19 November 2020 at 00:18:54 UTC, rikki cattermole >> >> You don't need the brackets to call a function (and with a little help from UFCS): >> >> void main() { >> import std.stdio; >> >> "Hello!".writeln; >> writeln; >> } > > Okay thanks. Bad idea IMO. Yes, calling `writeln` like that is a bad idea. That was a bad example. But the actual reason is, this is how D implements properties [1]. Any function that doesn't take an argument can be called without parentheses. Any function which takes a single argument can be called like setting a field. Here's an example: struct Color { private uint hex; int red() out(result; result >= 0 && result <= 255) // assert that the result is within bounds { return (hex & 0xFF0000) >> 16; } void red(int value) in(value >= 0 && value <= 255) // assert that the value is within bounds { hex = (hex & 0x00FFFF) | (value << 16); } // similar functions for green and blue } void main() { Color color; color.red = 255; assert(color.red == 255); } [1] https://en.wikipedia.org/wiki/Property_(programming) -- /Jacob Carlborg |
November 19, 2020 Re: betterC question | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Parker | On Thursday, 19 November 2020 at 01:42:16 UTC, Mike Parker wrote:
> On Thursday, 19 November 2020 at 00:20:50 UTC, Dibyendu Majumdar wrote:
>> On Thursday, 19 November 2020 at 00:18:54 UTC, rikki cattermole wrote:
>>
>>>
>>> You don't need the brackets to call a function (and with a little help from UFCS):
>>>
>>> void main() {
>>> import std.stdio;
>>>
>>> "Hello!".writeln;
>>> writeln;
>>> }
>>
>> Okay thanks. Bad idea IMO.
>
> Imagine what range pipelines would look like without it. This is one of my favorite D features.
Well Java and C# have streams and it looks perfectly fine without this kind of syntax.
|
November 19, 2020 Re: betterC question | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jacob Carlborg | On Thursday, 19 November 2020 at 09:23:25 UTC, Jacob Carlborg wrote:
> Yes, calling `writeln` like that is a bad idea. That was a bad example.
>
> But the actual reason is, this is how D implements properties [1]. Any function that doesn't take an argument can be called without parentheses. Any function which takes a single argument can be called like setting a field.
I think that properties on an object are a special case - but treating an random function identifier as callable is still bad.
|
Copyright © 1999-2021 by the D Language Foundation