Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hsylV-0003X8-Bs for pgsql-hackers@arkaria.postgresql.org; Thu, 01 Aug 2019 00:16:17 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1hsylU-0006xt-4q for pgsql-hackers@arkaria.postgresql.org; Thu, 01 Aug 2019 00:16:16 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hsylT-0006tI-P3 for pgsql-hackers@lists.postgresql.org; Thu, 01 Aug 2019 00:16:15 +0000 Received: from sss.pgh.pa.us ([66.207.139.130]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hsylR-0000td-C2 for pgsql-hackers@lists.postgresql.org; Thu, 01 Aug 2019 00:16:15 +0000 Received: from sss1.sss.pgh.pa.us (localhost [127.0.0.1]) by sss.pgh.pa.us (8.14.4/8.14.4) with ESMTP id x710G6Aw031807; Wed, 31 Jul 2019 20:16:06 -0400 From: Tom Lane To: Andres Freund cc: pgsql-hackers@lists.postgresql.org Subject: Re: POC: converting Lists into arrays In-reply-to: <30240.1564616409@sss.pgh.pa.us> References: <11587.1550975080@sss.pgh.pa.us> <20190731225756.nozn3j6lgwhm6qvq@alap3.anarazel.de> <30240.1564616409@sss.pgh.pa.us> Comments: In-reply-to Tom Lane message dated "Wed, 31 Jul 2019 19:40:09 -0400" MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-ID: <31805.1564618566.1@sss.pgh.pa.us> Date: Wed, 31 Jul 2019 20:16:06 -0400 Message-ID: <31806.1564618566@sss.pgh.pa.us> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk I wrote: > One idea is that we could do something like > foreach_variant(identifier, list_value) > { > type *v = (type *) lfirst_variant(identifier); > ... > } > where the "identifier" isn't actually a variable name but just something > we use to construct the ForEachState variable's name. (The only reason > we need it is to avoid confusion in cases with nested foreach's.) On second thought, there seems no strong reason why you should need to fetch the current value of a foreach-ish loop that's not the most closely nested one. So forget the dummy identifier, and consider this straw-man proposal: #define aforeach(list_value) ... (I'm thinking "anonymous foreach", but bikeshedding welcome.) This is just like the current version of foreach(), except it uses a fixed name for the ForEachState variable and doesn't attempt to assign to a "cell" variable. #define aforeach_current() ... Retrieves the current value of the most-closely-nested aforeach loop, based on knowing the fixed name of aforeach's loop variable. This replaces "lfirst(lc)", and we'd also need aforeach_current_int() and so on for the other variants of lfirst(). So usage would look like, say, aforeach(my_list) { type *my_value = (type *) aforeach_current(); ... } We'd also want aforeach_delete_current() and aforeach_current_index(), to provide functionality equivalent to foreach_delete_current() and foreach_current_index(). These names are a bit long, and maybe we should try to make them shorter, but more shortness might also mean less clarity. BTW, I think we could make equivalent macros in the old regime, which would be a good thing because then it would be possible to back-patch code using this notation. Thoughts? regards, tom lane