This commit should reduce the amount of iterations in concatenate to N
where N is the sum of the lengths of the input lists.
The previous implementation iterated from the beginning in each
concatenation because of `last-pair`.
This implementation is significantly faster in this extreme case:
(concatenate! `(,(iota 50000) ,@(map list (iota 500))))
>> Previous implementation:
real 0m0.671s
user 0m0.658s
sys 0m0.013s
>> This implementation:
real 0m0.175s
user 0m0.174s
sys 0m0.001s
The tests is done using `time`, which is not reliable at all, but using
`(trace last-pair)` shows accurately what happens with the iterations.
scale*10 is computed exactly until scale exceeds 2^54/10; in
contrast, scale*0.1 may not be computed exactly, and fl(0.1) is not
even 0.1.
WARNING: This change is not complete -- it does nothing to prevent
overflow with very long strings of digits after the decimal point.
By convention, a library meant for testing exports "run-tests".
Also by convention, assume the test for (foo bar) is (foo bar-test),
keeping the test in the same directory and avoiding confusion since
(chibi test) is not a test for (chibi).
- Avoids the hack of "load"ing test, with resulting namespace complications.
- Allows keeping tests together with the libraries.
- Allows setting up test hooks before running.
- Allows implicit inference of test locations when using above conventions.