Deutsch   English   Français   Italiano  
<20240711111357.00007712@yahoo.com>

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

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Michael S <already5chosen@yahoo.com>
Newsgroups: comp.lang.c
Subject: Re: technology discussion =?UTF-8?Q?=E2=86=92?= does the world need
 a "new" C ?
Date: Thu, 11 Jul 2024 11:13:57 +0300
Organization: A noiseless patient Spider
Lines: 94
Message-ID: <20240711111357.00007712@yahoo.com>
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>
	<v6mnch$21n94$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Injection-Date: Thu, 11 Jul 2024 10:13:33 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="cc2ba001c5d2368b495ec9c7cf5e7c33";
	logging-data="2492964"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1+4oDw3AB/9O0uBDeJzcwBKsQPjSOtty2I="
Cancel-Lock: sha1:s4jFobxnEjfkqCB7O5UBjUHa6p8=
X-Newsreader: Claws Mail 3.19.1 (GTK+ 2.24.33; x86_64-w64-mingw32)
Bytes: 4798

On Wed, 10 Jul 2024 21:28:15 +0200
David Brown <david.brown@hesbynett.no> wrote:

> 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);
> 

I fail to see a material difference between first class function values
in Haskell and C++ and first class function pointer values in C:

int doubler(int x) {
  return x*2;
}
int doTwice(int (*foo)(int), int x) {
  return foo(foo(x));
}
int quadrupler(int x) {
  return doTwice(doubler, x);
}

I am willing to believe that the difference exists, but your example is
too basic to demonstrate it.