Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) by h1439878.stratoserver.net (8.14.4/8.14.4/Debian-2ubuntu2.1) with ESMTP id t8PEuanH016514 for ; Fri, 25 Sep 2015 16:56:38 +0200 Received: from relay2.uni-heidelberg.de ([129.206.119.212]) by mx-ha.gmx.net (mxgmx010) with ESMTPS (Nemesis) id 0MEKYy-1ZusdD11oW-00FPdj for ; Fri, 25 Sep 2015 16:56:31 +0200 Received: from listserv.uni-heidelberg.de (listserv.uni-heidelberg.de [129.206.100.94]) by relay2.uni-heidelberg.de (8.13.8/8.13.8) with ESMTP id t8PEsVWQ015016 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 25 Sep 2015 16:54:32 +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.8) with ESMTP id t8P9blRn027302; Fri, 25 Sep 2015 16:54:31 +0200 Received: by LISTSERV.UNI-HEIDELBERG.DE (LISTSERV-TCP/IP release 16.0) with spool id 12593630 for LATEX-L@LISTSERV.UNI-HEIDELBERG.DE; Fri, 25 Sep 2015 16:54:31 +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.8) with ESMTP id t8PEsVx0030789 for ; Fri, 25 Sep 2015 16:54:31 +0200 Received: from mail-io0-f173.google.com (mail-io0-f173.google.com [209.85.223.173]) by relay.uni-heidelberg.de (8.14.1/8.14.1) with ESMTP id t8PEsPvH028013 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=FAIL) for ; Fri, 25 Sep 2015 16:54:28 +0200 Received: by iofb144 with SMTP id b144so113572934iof.1 for ; Fri, 25 Sep 2015 07:54:24 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.107.150.199 with SMTP id y190mr7430114iod.133.1443192864618; Fri, 25 Sep 2015 07:54:24 -0700 (PDT) Received: by 10.36.84.19 with HTTP; Fri, 25 Sep 2015 07:54:24 -0700 (PDT) References: <56020530.4070302@clear.net.nz> <56025C88.6050307@morningstar2.co.uk> <560465A8.2050901@clear.net.nz> Content-Type: text/plain; charset=UTF-8 Message-ID: Date: Fri, 25 Sep 2015 10:54:24 -0400 Reply-To: Mailing list for the LaTeX3 project Sender: Mailing list for the LaTeX3 project From: Bruno Le Floch Subject: Re: An incomplete int-erface? To: LATEX-L@LISTSERV.UNI-HEIDELBERG.DE In-Reply-To: <560465A8.2050901@clear.net.nz> Precedence: list List-Help: , List-Unsubscribe: List-Subscribe: List-Owner: List-Archive: Envelope-To: X-GMX-Antispam: 0 (Mail was not recognized as spam); Detail=V3; X-GMX-Antivirus: 0 (no virus found) X-UI-Filterresults: notjunk:1;V01:K0:emnFM55x7sc=:dj22dymRYCpVzG5fZHsbcwXDtg 1QENtxK4OywuAYMf7hLQdrkX9Mov30rHl6j2uvgiUfw0ko7bHwu/TVHmAbFBfLG34mjerY4kL xBr1FtnLf/x7AsTdKBHWmuLOHAohXCOUTDcebdVmGJOrF//SpA1lsn2LakZu0Us+1lMrzligP NKFv2hdvjzSVE+ldHo0Dwq2rowMEdF5fu5vlCy+YKihjRTnYBEN+xmY8Z9vShxl2mVW9R3Z5T 5A3Dyw66ofiVOfgp08pmDOsqx6mfpkGw78akzKx1Rl50gU987JqmIvQSQzKOZFT2Q48R5WTgE purVFbEKtVDRx3Gr8OVP4Ja9LnUbCALwZLj+x82tjauxs0wn6by+nK+aBUZ+6qoYy9c1eZsDL XQ8YGhq+hVqzmXuKFl/4rs46wWs/iCt/DIw1ZBOYrvtzjD3cbnw0AWXw4GudcKePp3VCzX3AQ hITBNqIpHIjv+C//IXVRk4uKbvvclF7wPN4lwZBMSb7SvyNTi3BPrmqKzOCUDvjI+idZiq1p0 N1mOuiWdqaZEFYe3ZIHgf7+L8jrgxYerXcQP39wPqE3lLtuYnsVRZUCvJvIX0G0WKB8sO0BnT 7OnUNGUFPtGf18SwrHLqD0Mrmx1AxHuz1qDISxFXPQ1T8wtQgLgC5saSPu4+Xe6vDpUPgAhBn LbPIQFQ6u9rxDCoKx5VSJXJ7n1jcqaVu47wQ5ciRPcfFY8hAx0oqNhsb3w1A9NcvVpU7oonZz ir1CZJVZo7Hdosg5SBmhwFOdKIOBuUlYmNdYakjdkLFkUq30Srd4EurcZ8OktvKq8FL9a6M0V Oz3MsN9eCPXCcL0Y6twF3p+7Hc47aPHFRnMaIupUWAnRHBvWU6jvi744PyvhzAZgYEduw2RRN WHBW0AY+jLnj7jKDAN7cXCleA0zokXzWkM2gq5ZCSJsPfcLo3sTHPXS4ntFYM0ocS3q+fVOvx ad8xyo8jKfGj27/erx5wfsQEGUwtDZ8ET9QR1mQxAmwom0UWXd0uCWCA9l001JYL0Iy7JXAOA qZPUkLf7hgyIwMBQDj+XbGEYNDKVRpGMnmn5ne6x39pHI0uhhI5zP55tCZ2CFscJ0mRDaEaZH hsalDKiQhiE4i4TuuasW98voxA6VKb8tksLiuR0gDOLhXkqkPq4XfjGH5K71RhidKf5FJTlze q1acJsHUE5h2oL7Xoxcfp9KVDWq4/o9+C7WDcuMQadvsRTcTkQDDrUMibJ4TEYjmxUMrTrKZi EMmXkoKhAf9fnc3OQWhBWe5r1dL1PyoSoF8GnbUoqUE7hLgLK3AKLKEDme4GrjRhB3WGZi4wo i/0LFHdgnU6yUD5acE8DqtqznWqy+ETU6iZ7IG+b/iN/tkz8vfWH4ZV+psLGdR5NHtxb70QuF OVr83zpEQH4rKLmhPEFdjSpNMqerWxydlc3IIfo9GQx479GKUJ2immps6iugBnrry1bq4ySfl oT2eVf2ReIBp74381KDfHaqTZYxz8JGBzlxZLcjxiON/VFeLQN X-UI-Loop:V01:f/I6QH36Qs4=:AeEuUG+8nDKptUYvRxwhKR2x8eTglwBTFD96mWJjn1I= X-UI-Out-Filterresults: notjunk:1;V01:K0:bWsSLQ+Q3FI=:2nSy2rsaB0Z2wqhHWY2qpK YvMrgOjltURPey0MJsyc0uPGRX4Cuh6qEMHUupaWyae8lMBile+zB99FnGm+BANWNWnoXIIfz Lsd9odFDGgbKqZ5e+kgzrNR5EE6y3mQk4cgP0+cpnB2xTdEYPENCFiAxDUXTIO7WGFzaFtKe1 4e0k+zrqe1DtcFhc5fxEqFsSOa3x79eIsHQZ/X8T6mQ9gdk5LVJqKUkJHQNUyDd4zecpVCbSr tK7IyBZEH7Gh5itnqNEvUw13kLvgl3BMIwSkMT+u121Qqre+dEOSYV8Wh102S70Kf+5mMTbWp TivIUldbT1fNJkUa2hrhmX0wvVmnBz9BqRrh/gkv1srb47+MP06cwNu5VBgbM0p7Bqd/36jI6 Gevx8XU49QfEwTLnoVc0QVuxlxMUgrqvsW9W0Dgw8YwLVVDkzPldDrZuUSMVVckd/njCv6RKe p8cIyuhbMj1qknUKbRu414QCdC3054vFbzN07dswVZRf125Lu3Ao X-Scanned-By: MIMEDefang 2.71 on 85.214.41.38 Status: R X-Status: X-Keywords: X-UID: 7894 On 9/24/15, Andrew Parsloe wrote: > On 25/09/2015 5:14 a.m., Bruno Le Floch wrote: >> On 9/23/15, Joseph Wright wrote: >>> On 23/09/2015 02:49, Andrew Parsloe wrote: >>>> \int_eval:n { - (1+2) } >>>> >>>> gives a "Missing number, treated as zero" message. So does \int_eval:n >>>> { >>>> + (1+2) }. >> As Joseph says, this is due to the syntax of eTeX's primitive \numexpr. >> Let me answer Will's suggestion of adding "0+" to the start of every >> \int_eval:n. That won't cover cases such as \int_eval:n { 1 + ( - (2 >> + 3) + 4) * 5 } where the "-(" construction (with no left-hand >> operand) appears in the middle of an expression. >> >>>> But >>>> >>>> \int_eval:n { 0 - (1+2) } >>>> >>>> evaluates correctly. If + ( or - ( are the first members of an integer >>>> argument, an error results; if they are not the first members, they are >>>> accepted by \int_eval:n etc. I don't know that this is a bug as such >>>> but >>>> it certainly feels to me like an untidiness in the l3int interface. It >>>> means that the order in which component parts of an expression are >>>> presented to \int_eval:n matters, even though in an arithmetical sense, >>>> they evaluate to the same number. >> I agree that it would be better to have a nicer interface, and it is >> very close to being a bug, but one in eTeX rather than LaTeX3, and not >> fixable on our end. >> >>>> I query too whether an expression like >>>> >>>> \int_eval:n { 3(1+2) } >>>> >>>> should "evaluate" to 3(1+2), rather than 9, without showing an error. >> That we could catch. Heiko once suggested that we include parentheses >> in our expressions, defining \int_eval:n {#1} as \tex_the:D >> \etex_numexpr:D (#1) \tex_relax:D . That would at least produce an >> error when an expression is terminated early (say because of a ^ or >> juxtaposition, or space in the middle of a number, etc). >> >> Of course that wouldn't help with unbalanced parentheses. >> >>>> (Alternatively, I find myself wondering what would be entailed to >>>> harmonize the integer interface with the fp one (which has no problem >>>> with these expressions)? Then one could choose whether to evaluate an >>>> expression involving integral numerals in l3fp or l3int without having >>>> to change the expression, as one does at present. For instance, if the >>>> expression involves an exponent, use l3fp; if not use l3int. This >>>> choice >>>> becomes more complicated when the expression itself needs to be >>>> changed.) >>>> >>>> Andrew >>> The different 'behind the scenes' here is that \int_eval:n is just the >>> engine \numexpr primitive in a macro wrapper, but \fp_eval:n is >>> implemented entirely in macros (as there is no floating-point >>> primitive). Thus while we can alter the parser for fp work, we can't for >>> int work, or rather not without significant changes. In particular, >>> there would be a performance implication in parsing int input and doing >>> the calculations 'by hand'. I suspect int parsing would be easier than >>> for fp expressions, but even so this looks like a significant effort. >> I would expect at least a 10x slow-down (rough estimate, I can look >> into this more if requested). >> >>> As Will has commented, we might manage at low cost to avoid the bracket >>> issue, but allowing \int_eval:n { 3(1+2) } would be rather more tricky. >>> Indeed, I'd probably say we shouldn't: here I think requiring an >>> explicit "*" is the right approach. Bruno is best-placed to comment on >>> the fp implementation here. >> I actually fear that I probably made a mistake when allowing >> juxtaposition of this kind in l3fp. Maybe it is not too late to >> change. We never really had time for a discussion of the syntax of >> l3fp, which I cooked up myself with no outside input. >> >>> The reason I'm wary of making any changes, quite apart from effort both >>> in terms of the team and in terms of TeX when using expressions, is that >>> life gets more complex when you look at dim/skip/muskip cases. There, >>> the underlying primitives have particular requirements, thus >>> >>> \dim_eval:n { 4pt * 3 } >>> >>> is valid but >>> >>> \dim_eval:n { 3 * 4pt } >>> >>> is not. I really don't think we want to implement all of the necessary >>> parsing for this by hand, so saying that we follow the underlying >>> primitive requirements is a position I think we are best with in >>> general. >> Yeah, getting this \dim_eval:n to work would require pretty much as >> much work as fp parsing. The code is mostly available but I would >> expect something like a 100x slow down. >> >>> BTW, as far as I know there is nothing that would be valid for an int >>> expr. that would fail for l3fp. >> That is true, so any int expression can be turned into an fp one if >> you realize that you want to use ^ for instance. The reverse is not >> true. >> >> Bruno >> > Thank you all for your replies, which fill in the background for me. I > have been using l3fp intensively for a while, but have only recently > started using l3int in earnest, at least in part for the presumed > performance gain, when these particular issues have arisen. (Looking at > those references to 10x slow down, or 100x slow down, might there be > room in l3kernel or l3packages for an l3timer module?) > > Andrew I typically use l3benchmark, which is not on CTAN but can be found in the l3trial directory (see https://github.com/latex3/latex3/tree/master/l3trial/l3benchmark ). I never got back to working on it, but there are quite a few improvements to be had. Some day, perhaps, I'll have time and it can be moved to l3experimental. Bruno