Path: csiph.com!weretis.net!feeder6.news.weretis.net!news.misty.com!news.iecc.com!.POSTED.news.iecc.com!nerds-end From: Kaz Kylheku <864-117-4973@kylheku.com> Newsgroups: comp.compilers Subject: Re: another C-like language? was Compilers :) Date: Wed, 11 Jan 2023 11:02:56 -0000 (UTC) Organization: A noiseless patient Spider Sender: news@iecc.com Approved: comp.compilers@iecc.com Message-ID: <23-01-038@comp.compilers> References: <23-01-001@comp.compilers> <23-01-002@comp.compilers> <23-01-003@comp.compilers> <23-01-008@comp.compilers> <23-01-016@comp.compilers> <23-01-029@comp.compilers> <23-01-033@comp.compilers> Injection-Info: gal.iecc.com; posting-host="news.iecc.com:2001:470:1f07:1126:0:676f:7373:6970"; logging-data="94550"; mail-complaints-to="abuse@iecc.com" Keywords: C, design Posted-Date: 11 Jan 2023 18:09:11 EST X-submission-address: compilers@iecc.com X-moderator-address: compilers-request@iecc.com X-FAQ-and-archives: http://compilers.iecc.com Xref: csiph.com comp.compilers:3306 On 2023-01-10, David Brown wrote: > On 09/01/2023 18:41, Kaz Kylheku wrote: >> On 2023-01-06, David Brown wrote: >> A block like this can be repeated with copy and paste: >> >> { >> int yes = 1; >> setsockopt(fd, SO_WHATEVER, &yes); >> } >> >> This cannot: you will get redefinition errors: >> >> int yes = 1; >> setsockopt(fd, SO_WHATEVER, &yes); >> >> you have to think about ensuring that "int yes" occurs in one place >> that is before the first use, and the other places assign to it. >> Or invent different names. > > This is something that I would prefer C and C++ to allow. I think it > would improve the structure of some of my code, precisely as you describe. It seems that Scheme, with its ugly (define ...) that can be used inside block scopes, has the same restriction! I tried (lambda () (define x 42) (define x 43)) in a Scheme implementation and got an error about the duplicate variable. That's completely silly since it breaks the idea that the block scoped define can just be desugared to nested lets. On a related topic, the CLISP implementation of Common Lisp, whose history goes back to the 1980s, availed itself of mixing variable declarations and statements even in C90. Its source files are named with a .d suffix, and are preproced by a "varbrace" tool which spits out the brace-enclosed blocks. I seem to recall that variables are prefixed with a "var" specifier, which probably makes it easy for the tool to recognize declarations. It may likely be the case that under CLISP's "varbrace" you can repeat variable names. ... and searching for varbrace, I see a 2017 thread in the CLISP mailing list by someone who posted a patch to rid CLISP of varbrace, and just use C99. The patch submmitter mentions that he had to rename some instances of repeated variables, making this remark: Another issue is conflicting definitions of the same variable. Example: var type1 foo; // some code var type2 foo; This is solved by renaming one of them, if possible. In two places, I manually added braces (like varbrace would've done) -- TXR Programming Language: http://nongnu.org/txr Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal Mastodon: @Kazinator@mstdn.ca