Path: csiph.com!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Tim Rentsch
Newsgroups: comp.lang.c
Subject: Re: transpiling to low level C
Date: Sun, 22 Dec 2024 17:22:01 -0800
Organization: A noiseless patient Spider
Lines: 81
Message-ID: <86seqfdwhy.fsf@linuxsc.com>
References: <86ikrdg6yq.fsf@linuxsc.com> <20241222132505.353@kylheku.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Injection-Date: Mon, 23 Dec 2024 02:22:02 +0100 (CET)
Injection-Info: dont-email.me; posting-host="175d13363d069c69169282e3d646d5d4"; logging-data="935447"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18TxXkGCie+oq/BzA5jQSRef1TVsmlhm5I="
User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.4 (gnu/linux)
Cancel-Lock: sha1:aZAjt1EDQZv+xolAj3F3tTTwKb8= sha1:fofGAqIrcu1R6HliPnqUMduwJgw=
Xref: csiph.com comp.lang.c:389787
Kaz Kylheku <643-408-1753@kylheku.com> writes:
> On 2024-12-21, Janis Papanagnou wrote:
>
>> On 21.12.2024 02:28, Tim Rentsch wrote:
>>
>>> Janis Papanagnou writes:
>>>
>>>> On 16.12.2024 00:53, BGB wrote:
>>>>
>>>>> [...]
>>>>>
>>>>> Pretty much all higher level control flow can be expressed via
>>>>> goto.
>>>>
>>>> A 'goto' may be used but it isn't strictly *necessary*. What *is*
>>>> necessary, though, that is an 'if' (some conditional branch), and
>>>> either 'goto' or recursive functions.
>>>
>>> Conditional branches, including 'if', '?:', etc., are not strictly
>>> necessary either.
>>
>> No? - Can you give an example of your statement?
>
> In a functional langauge, we can make a decision by, for instance,
> putting two lambdas into an array A, and then calling A[0] or A[1],
> where the index 0 or 1 is comes from some Boolean result.
>
> The only reason we have a control construct like if(A, X, Y) where X
> is only evaluated if A is true, otherwise Y, is that X and Y
> have side effects.
>
> If X and Y don't have side effects, then if(A, X, Y) can be an ordinary
> function whose arguments are strictly evaluated.
>
> Moreover, if we give the functional language lazy evaluation
> semantics, then anyway we get the behavior that Y is not evaluated
> if A is true, and that lazy evaluation model can be used as the
> basis for sneaking effects into the functional language and
> conctrolling them.
>
> Anyway, Turing calculation by primitive recursion does not require
> conditional branching. Just perhaps an if function which returns
> either its second or third argument based on the truth value of its
> first argument.
>
> For instance, in certain C preprocessor tricks, conditional
> expansion is achieved by such macros.
>
> When we run the following through the GNU C preprocessor (e.g. by
> pasting into gcc -E -x c -p -):
>
> #define TRUE_SELECT_TRUE(X) X
> #define TRUE_SELECT_FALSE(X)
>
> #define FALSE_SELECT_TRUE(X)
> #define FALSE_SELECT_FALSE(X) X
>
> #define SELECT_TRUE(X) X
> #define SELECT_FALSE(X)
>
> #define PASTE(X, Y) X ## Y
>
> #define IF(A, B, C) PASTE(TRUE_SELECT_, A)(B) PASTE(FALSE_SELECT_, A)(C)
>
> #define FOO TRUE
> #define BAR FALSE
>
> IF(FOO, foo is true, foo is false)
> IF(BAR, bar is true, bar is false)
>
> We get these tokens:
>
> foo is true
> bar is false
>
> Yet, macro expansion has no conditionals. The preprocessing
> language has #if and #ifdef, but we didn't use those. Just
> expansion of computed names.
Nice example.