Received: from mx0.gmx.net (mx0.gmx.net [213.165.64.100]) by h1439878.stratoserver.net (8.14.2/8.14.2/Debian-2build1) with SMTP id p8IDofDi011969 for ; Sun, 18 Sep 2011 15:50:42 +0200 Received: (qmail 2141 invoked by alias); 18 Sep 2011 13:50:36 -0000 Delivered-To: GMX delivery to rainer.schoepf@gmx.net Received: (qmail invoked by alias); 18 Sep 2011 13:50:35 -0000 Received: from relay.uni-heidelberg.de (EHLO relay.uni-heidelberg.de) [129.206.100.212] by mx0.gmx.net (mx097) with SMTP; 18 Sep 2011 15:50:35 +0200 Received: from listserv.uni-heidelberg.de (listserv.uni-heidelberg.de [129.206.100.94]) by relay.uni-heidelberg.de (8.14.1/8.14.1) with ESMTP id p8IDmIAA011925 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 18 Sep 2011 15:48:18 +0200 Received: from listserv.uni-heidelberg.de (localhost.localdomain [127.0.0.1]) by listserv.uni-heidelberg.de (8.13.1/8.13.1) with ESMTP id p8HM14aL032401; Sun, 18 Sep 2011 15:48:17 +0200 Received: by LISTSERV.UNI-HEIDELBERG.DE (LISTSERV-TCP/IP release 16.0) with spool id 1594351 for LATEX-L@LISTSERV.UNI-HEIDELBERG.DE; Sun, 18 Sep 2011 15:48:17 +0200 Received: from relay.uni-heidelberg.de (relay.uni-heidelberg.de [129.206.100.212]) by listserv.uni-heidelberg.de (8.13.1/8.13.1) with ESMTP id p8IDmHro016515 for ; Sun, 18 Sep 2011 15:48:17 +0200 Received: from lon1-post-2.mail.demon.net (lon1-post-2.mail.demon.net [195.173.77.149]) by relay.uni-heidelberg.de (8.14.1/8.14.1) with ESMTP id p8IDlwFJ011865 for ; Sun, 18 Sep 2011 15:48:02 +0200 Received: from morningstar2.demon.co.uk ([80.176.134.7] helo=palladium.local) by lon1-post-2.mail.demon.net with esmtp (Exim 4.69) id 1R5Hiw-0003aS-bF for LATEX-L@LISTSERV.UNI-HEIDELBERG.DE; Sun, 18 Sep 2011 13:47:58 +0000 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:6.0.2) Gecko/20110902 Thunderbird/6.0.2 MIME-Version: 1.0 References: <4E692829.2000003@morningstar2.co.uk> <4E75B860.40106@morningstar2.co.uk> X-Enigmail-Version: 1.3.1 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit Message-ID: <4E75F68E.80004@morningstar2.co.uk> Date: Sun, 18 Sep 2011 14:47:58 +0100 Reply-To: Mailing list for the LaTeX3 project Sender: Mailing list for the LaTeX3 project From: Joseph Wright Subject: Re: Removal of previously-notified functions To: LATEX-L@listserv.uni-heidelberg.de In-Reply-To: Precedence: list List-Help: , List-Unsubscribe: List-Subscribe: List-Owner: List-Archive: X-GMX-Antispam: 0 (Sender is in whitelist: joseph.wright@MORNINGSTAR2.CO.UK); Detail=5D7Q89H36p4L00VTXC6D4q0N+AH0PUCnBi0P5cROEGjO+pG7NAH/K+tf9SrVFtpLrKONl 2T9EL4W4U4jgzLbnCcGpk1z/zwmKT/K1fv3lD0=V1; X-Resent-By: Forwarder X-Resent-For: rainer.schoepf@gmx.net X-Resent-To: rainer@rainer-schoepf.de Status: R X-Status: X-Keywords: X-UID: 6873 On 18/09/2011 10:53, Philipp Stephani wrote: >> Part of the reasoning we had here is that \tl_new:Nn was being used >> almost entirely for declaring constants. We have a conceptually-separate >> \tl_const:Nn for that job. > > I think both make sense, just like in other programming languages, > where you have e.g. "const int x = ..." as well as "int x = ...". This very much depends on the other languages you are used to. Like Will, I guess I prefer the separate 'declare' and 'assign' operations. >> The other part to the reasoning was that while we had \tl_new:Nn, we did >> not have \int_new:Nn, etc. So we were not exactly consistent in that >> regard. I guess based on the underlying TeX concept that registers have >> to be allocated separately to assignment, it seemed easier to take a >> similar approach to everything. (I also note that we'd have issues with, >> for example, property lists as they can't really be created and >> fully-assigned in one shot, at least through anything like the >> documented interface.) > > I would indeed propose having both _new:N and _new:Nn for all variable > types. Adding them should not be a big deal (since all parts are > already there), but simulating them manually is quite cumbersome, > especially because variable names tend to be quite long due to the > lack of namespaces: > > \int_new:N \l_package_foo_bar_int > \int_set:Nn \l_package_foo_bar_int { 1 + 2 } I'm still not sure how many real use cases there are where these are not either constants or better handled as keyval-assigned variables (where 'define' and 'set' are separate). >>> Also a \cs_new:N command is missing which reserves a "function" name >>> without assigning it. Both \io[rw]_new:N and \cs_new:N can essentially >>> be aliases for \chk_if_free_cs. >> >> Well, they can't simply be \chk_if_free... as there has to be a >> 'reserve' stage too. With \cs_new:N, the problem was that you don't know >> how many arguments there may be, or in what form they could be. So you'd >> at the least need \cs_new:Np, and then have to work out how to delimit >> the end of the primitive argument specification. That's before you worry >> about long and protected status (which apart from a small number of >> tmp:w functions should not vary). So for functions I'm not sure I see a >> gain over \cs_new(_protected)(_nopar):N(p)n. > > This is only for the situation where one wants to reserve a macro name > for later use. In fact, \cs_new:N could be \chk_if_free_cs (then it is > irrelevant what arguments will be there—I'm using this regularly to > make sure a certain name is not taken yet), or \cs_new_eq:NN #1 \q_nil > or \cs_new_eq:NN #1 \prg_do_nothing:c, with different semantics. I've got two concerns here. First, you can't simply use \chk_if_free_cs:N, as it does not reserve the name. For example, \cs_set_eq:NN \cs_new:N \chk_if_free_cs:N \cs_new:N \test \cs_new:Npn \test { } does not raise an error, even though \test has apparently already been 'taken' by \cs_new:N. Once something has been set 'new', it's supposed to be globally defined. (There are a few internal variations on that, for example some key properties in l3keys. We've tried to minimise these.) Secondly, I stick by my point about arguments and so forth. With the exception of ":w" functions, the arguments for a function should not change. So \mod_foo:nn always needs to absorb two arguments, If it performs an assignment has to be protected, whereas if it's used in an expandable context then it should not be protected. So using \cs_new...:Npn \mod_foo:nn #1#2 { } for 'reserving' a name seems the best way to me. I don't see a gain adding an entire set of \cs_new:N-type functions. -- Joseph Wright