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.