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 q7O6ixgH024236 for ; Fri, 24 Aug 2012 08:45:00 +0200 Received: (qmail 27919 invoked by alias); 24 Aug 2012 06:44:54 -0000 Delivered-To: GMX delivery to rainer.schoepf@gmx.net Received: (qmail invoked by alias); 24 Aug 2012 06:44:54 -0000 Received: from relay.uni-heidelberg.de (EHLO relay.uni-heidelberg.de) [129.206.100.212] by mx0.gmx.net (mx026) with SMTP; 24 Aug 2012 08:44:54 +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 q7O6gt6Q007798 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 24 Aug 2012 08:42:55 +0200 Received: from listserv.uni-heidelberg.de (listserv.uni-heidelberg.de [127.0.0.1]) by listserv.uni-heidelberg.de (8.13.8/8.13.1) with ESMTP id q7NK8NkA016221; Fri, 24 Aug 2012 08:42:55 +0200 Received: by LISTSERV.UNI-HEIDELBERG.DE (LISTSERV-TCP/IP release 16.0) with spool id 2340164 for LATEX-L@LISTSERV.UNI-HEIDELBERG.DE; Fri, 24 Aug 2012 08:42:55 +0200 Received: from relay.uni-heidelberg.de (relay.uni-heidelberg.de [129.206.100.212]) by listserv.uni-heidelberg.de (8.13.8/8.13.1) with ESMTP id q7O6gteL007118 for ; Fri, 24 Aug 2012 08:42:55 +0200 Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.17.8]) by relay.uni-heidelberg.de (8.14.1/8.14.1) with ESMTP id q7O6gcgB007721 for ; Fri, 24 Aug 2012 08:42:41 +0200 Received: from mittelbach-online.de (p4FEE50DC.dip.t-dialin.net [79.238.80.220]) by mrelayeu.kundenserver.de (node=mrbap0) with ESMTP (Nemesis) id 0LqWEj-1TZTiR2u7F-00e2Cp; Fri, 24 Aug 2012 08:42:38 +0200 Received: by mittelbach-online.de (Postfix, from userid 783) id E7B6A10A0BFA; Fri, 24 Aug 2012 08:42:36 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on Marlowe X-Spam-Status: No, score=-1.4 required=5.0 tests=ALL_TRUSTED,AWL autolearn=unavailable version=3.2.5 Received: from [127.0.0.1] (unknown [192.168.123.100]) (Authenticated sender: frank) by mittelbach-online.de (Postfix) with ESMTPSA id 5230E10A0BF6 for ; Fri, 24 Aug 2012 08:42:35 +0200 (CEST) User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20120713 Thunderbird/14.0 MIME-Version: 1.0 References: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Antivirus: avast! (VPS 120824-0, 24.08.2012), Outbound message X-Antivirus-Status: Clean X-Provags-ID: V02:K0:aWMqCFAohC28cq+olOGcK030OHysP6gBMATt2Sju9Mv 5yCsSUirDb++N3mguHrsW4/1RWNKeVLm7kg/5z91aHFnuHc0pf RRje6/5MSztZE6v98kGQtJJdvX2TSZlYKvZsdz2bO4Lr419zX5 MClk+0HRL5SrgnRilEGI3a2cNhBCZBeLg2BMoIOZQpSR5/55+T T7GpzEzzK5YuTG3m0dIVrWNCWbNdUazEgZ0c53KnipPPHJjjY2 ZOMPaYT2iYdUrRAFIEvXXoOVYPESbssna/1gJbCv2bl46+jMTT NlPZ3XJwU+EzD+UpIxzAd12PtDra+CYzSgSCxqknM9JHsQNMBD SCEqcEchyTYvznAq3B9JLEx09YDkLiw+Vw5IzmDU/ Message-ID: <50372259.7040300@latex-project.org> Date: Fri, 24 Aug 2012 08:42:33 +0200 Reply-To: Mailing list for the LaTeX3 project Sender: Mailing list for the LaTeX3 project From: Frank Mittelbach Subject: Re: What does the `_x:` suffix mean? 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 (eXpurgate); Detail=5D7Q89H36p5x1RWm4Ldx8pHNe5ytInNciVTWlIsAQdXoULXzl3LIFoO+WxYP+KVazN7pA JWxDZzkGNERb6pSUKcZWjkvb0XbZXU01rtAkyDoV7S198OCOQLnH++GWN9VSe/u7hcISvl+EBDZV G3DHGyPub+2FZYdJ1wInzxE3JlMdtXoVUnnZo7XXvznLg1kmiY1Mn/Fvco=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: 7141 Am 24.08.2012 04:37, schrieb Joel C. Salomon: > > What's the difference between the `:x` signature and the `_x:n` > suffix+signature? Bruno gave a very nice and elaborate explanation. I just want to highlight one point here as it is central to the idea of the "argument spec/argument manipulation" syntax. The main idea of that syntax (and I'm not sure we have explained that well enough) is - that it describes how arguments are manipulated/modified *before* they are passed to a "base" function. - they do not describe what happens inside the function with the values passed as arguments. The key point here is really that the manipulation happens *before*. Base functions those that have only :n or :N arguments. All other arg-specifiers manipulate arguments first and than pass the result to the base function. Conceptually this means - there should always be a base function defined not just a variant - variants (ie, those with :x or :o or ...) are defined via \cs_generate_variant:Nn - or if not, they behave *exactly* as if defined this way (ie, sometimes for very heavily used functions it might be better to code them differently for speed reasons (but we expect that to be not necessary often or outside the kernel) A corollary of this is that if the kernel, say, provide \foo:nnn but not \foo:nxo and some package needs it, it will be safe for the package to go \cs_generate_variant:Nn \foo:nnn {nxo} and that will be true regardless of some other package doing the same or the kernel (or some other package) defining an optimized variant \foo:nxo at some point in the future. Now when we ran the last consolidation round on function names, we noticed that we violated this principle sometimes and in cases where we felt it was important to indicate to something gets e"x"panded inside as part of the function behavior we introduced _x as part of the function name. frank