Deutsch   English   Français   Italiano  
<v6mnch$21n94$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!2.eu.feeder.erje.net!feeder.erje.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: David Brown <david.brown@hesbynett.no>
Newsgroups: comp.lang.c
Subject: =?UTF-8?Q?Re=3A_technology_discussion_=E2=86=92_does_the_world_need?=
 =?UTF-8?B?IGEgIm5ldyIgQyA/?=
Date: Wed, 10 Jul 2024 21:28:15 +0200
Organization: A noiseless patient Spider
Lines: 77
Message-ID: <v6mnch$21n94$1@dont-email.me>
References: <v66eci$2qeee$1@dont-email.me> <v6ard1$3ngh6$4@dont-email.me>
 <v6b0jv$3nnt6$1@dont-email.me> <87h6d2uox5.fsf@nosuchdomain.example.com>
 <v6d779$6rk5$2@dont-email.me> <v6e76u$c0i9$1@dont-email.me>
 <v6esqm$fian$2@dont-email.me> <v6f7vg$hgam$1@dont-email.me>
 <20240707164747.258@kylheku.com> <v6gl83$s72a$1@dont-email.me>
 <v6h8ao$ur1v$1@dont-email.me> <v6jhk3$1drd6$1@dont-email.me>
 <v6jiud$1dsjb$1@dont-email.me> <877cdur1z9.fsf@bsb.me.uk>
 <v6joi4$1epoj$1@dont-email.me> <871q42qy33.fsf@bsb.me.uk>
 <v6k6i0$1h4d3$1@dont-email.me> <87ed82p28y.fsf@bsb.me.uk>
 <v6m03l$1tf05$1@dont-email.me> <87r0c1nzjj.fsf@bsb.me.uk>
 <v6m716$1urj4$1@dont-email.me> <86ikxd8czu.fsf@linuxsc.com>
 <20240710201454.0000527e@yahoo.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Date: Wed, 10 Jul 2024 21:28:17 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="c985da9317a18f8af2811d5dea43797f";
	logging-data="2153764"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1/+zgNdw4rof0GGYjyu5EftB+rSIhpJT3c="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:n7iePWmvrs2x+yChhj5HWKxJmfo=
In-Reply-To: <20240710201454.0000527e@yahoo.com>
Content-Language: en-GB
Bytes: 4212

On 10/07/2024 19:14, Michael S wrote:
> On Wed, 10 Jul 2024 08:48:05 -0700
> Tim Rentsch <tr.17687@z991.linuxsc.com> wrote:
> 
>> bart <bc@freeuk.com> writes:
>>
>>> I earlier asked this:
>>>
>>> "So if arrays aren't passed by value in C, and they aren't passed
>>> by reference, then how the hell ARE they passed?!"
>>
>> They aren't.  C allows lots of things to be passed as an argument
>> to a function:  several varieties of numeric values, structs,
>> unions, and pointers, including both pointers to object types and
>> pointers to function types.  C does not have a way for a function
>> to take an argument that is either an array or a function.  There
>> is a way to take pointers to those things, but not the things
>> themselves.  Arrays and functions are second-class values in C.
>>
> 
> I'd like to see an example of the language that permits ahead-of-time
> compilation and has functions as first-class values.
> 

Haskell is the first the comes to mind for me, but you could pick any 
compiled functional programming language.

I am by no means a Haskell expert, and I am not at all familiar with the 
way the language is compiled.  But it is quite clear that it is an 
example of a language that has functions as first-class objects, and 
which is ahead-of-time compiled.  The example below defines an 
int-to-int function "doubler", and also a function-to-function function 
"doTwice", and a function quadrupler that is defined as the result of 
applying the higher-order function doTwice to doubler.  These are all 
compiled to assembly.

<https://godbolt.org/z/Tb7hGYsdv>


module Example where

doubler :: Int -> Int
doubler x = 2 * x

doTwice :: (Int -> Int) -> (Int -> Int)
doTwice f x = f (f x)

quadrupler = doTwice doubler

shouldBeEighty = quadrupler 20



You can write much the same in C++ using lambdas (which are objects and 
can be passed around and returned as such) and templates (which are 
needed because the type of lambdas is hidden).  Unfortunately, this also 
means that the functions don't get individually generated functions in 
assembly:

<https://godbolt.org/z/KvPWz3n8z>

auto doubler = [](int x) -> int { return 2 * x; };

auto doTwice = [](auto f) -> auto
{
     return [f](int x) -> int { return f(f(x)); };
};

auto quadrupler = doTwice(doubler);

auto shouldBeEiqhty = quadrupler(20);