Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Bart Newsgroups: comp.lang.c Subject: Re: question about linker Date: Sat, 7 Dec 2024 00:30:34 +0000 Organization: A noiseless patient Spider Lines: 77 Message-ID: References: <8WK4P.16316$xPr6.10730@fx10.iad> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Sat, 07 Dec 2024 01:30:33 +0100 (CET) Injection-Info: dont-email.me; posting-host="92f4e16e4a21192eb5e2d0ba1a6ec304"; logging-data="2811943"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19/tEfuFh8CK0hGT7kEqX1U" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:NIh5vMlngoyr3p02QAw7gSbKQjs= Content-Language: en-GB In-Reply-To: <8WK4P.16316$xPr6.10730@fx10.iad> Bytes: 3435 On 06/12/2024 22:30, Scott Lurndal wrote: > Ike Naar writes: >> On 2024-12-06, Bart wrote: >>> My language: >>> >>> println =a,=b # 13 characters, 0 shifted >>> >>> (And that space is optional!) In C (assume the existence of stdio.h): >>> >>> printf("A=%lld B=%f\n",a,b); # ~28 characters, 8 shifted >>> >>> Enough said. >> >> Looks like a cherry-picked example. >> How would this (slightly modified) C statement be notated in your language: >> >> printf("a:%lld b:%g\n",a,b); >> >> ? > > Or > > printf("a:%2$8.8lld b:%1$10.2g",b,a); In this case I'd just write it like this: printf("a:%2$8.8lld b:%1$10.2g",b,a) ie. calling printf via an FFI. It's marginally shorter than C since I don't need the semicolon. However, your attempt to catch me out on something I might not support has backfired, since it doesn't work even in C. This program: #include int main(void) { long long a = 123456789876543210; double b=1.0/3; printf("a:%2$8.8lld b:%1$10.2g",b,a); } compiled with gcc 14.1 on Windows, produces: a:%2$8.8lld b:%1$10.2g On WSL and gcc 9.x it works, sort of. (Matching the label in the format string with the $ value and the argument looks confusing.) I'd typically do this stuff like this: const fmta = "8.8", fmtb = "10.2" fprint "a:# b:#", a:fmta, b:fmtb Here I don't need to care what the exact types of a and b are. I mean, what goes in place of ? here: printf("%?", a+b*c); Assume only that a, b, c are numeric types, which might be opaque types exported by some header. Here's another issue: #include int main(void) { int i=0; printf("%d %d %d", ++i, ++i, ++i); } 3 compilers give me output of 1,2,3; 3,2,1; and 3,3,3. If I do 'print ++i, ++i, ++i', it gives me 1,2,3 always. (Because this print is not a function call.)