l...@gnu.org (Ludovic Courtès) writes: > Hi Andreas, > > I’m all for your suggestion. > > Andreas Rottmann <a.rottm...@gmx.at> writes: > >> + (define-syntax define-fxop* >> + (syntax-rules () >> + ((_ name op) >> + (define name >> + (case-lambda >> + ((x y) >> + (assert-fixnum x y) >> + (op x y)) >> + (args >> + (assert-fixnums args) >> + (apply op args))))))) >> + >> + (define-fxop* fx=? =) > > How about making something like this (untested): > > (define-syntax define-fxop* > (syntax-rules () > ((_ name op) > (define-syntax name > (lambda (s) > (syntax-case s () > ((_ x y) > #'(begin > (assert-fixnum x y) > (op x y))) > ((_ args ...) > #'(apply op args)) > (_ #'op))))))) > > This way, there’d be no procedure call involved and ‘=’, ‘+’, etc. would > use the corresponding instruction in the base case. > That's an excellent idea, and would probably boost performance quite a bit. However, there's still the issue that the non-two-args cases don't throw the exceptions required by R6RS. Upon trying to interpret the R6RS in a way that would lift that requirement, I still see no way to do so in the general case, due to the following quite explicit language:
Fixnum operations perform integer arithmetic on their fixnum arguments, but raise an exception with condition type &implementation-restriction if the result is not a fixnum. So even if checking the arguments seems to be not explicitly required (but might be implictly intended -- "fixnum arguments"), the result must definitly be a fixnum, or the mentioned exception be thrown. So for the sake of efficiency, while heeding what is explictly required, I propose the following: - Alias all fixnum operations that yield non-fixnums (e.g. fx<?, fx>?, ...) with the corresponding non-fixnum procedures. IMHO, that seems to be within bounds wrt. R6RS; Section 5.4 "Argument checking" says: The implementation must check that the restrictions in the specification are indeed met, to the extent that it is reasonable, possible, and necessary to allow the specified operation to complete successfully. One might argue that it is not reasonable (for efficiency reasons related to the way Guile is currently implemented) and certainly not necessary to check the arguments for fixnum-ness in these procedures. - Otherwise, do the macro trick as above, but fall back on a procedure like in SRFI-9's `define-inlinable' for the non-binary case. Thoughts? Regards, Rotty -- Andreas Rottmann -- <http://rotty.yi.org/>