Schneller Start ohne RubyGems, Rational statt BigDecimal, Helfer in Rdb::Helpers

bin/rdb läuft mit --disable-gems (ca. 85 statt 170 ms je Befehl), dafür
rechnen Summen und /act mit Rational. Hilfsfunktionen und Konstanten liegen
nicht mehr auf Object, Kopf-/Strichzeile und awk-Aufruf an einer Stelle.
Tests laufen parallel: 21 statt 70 Sekunden.
This commit is contained in:
wkh
2026-10-30 10:01:36 +01:00
parent 1c489f6994
commit c2ea36c6d6
16 changed files with 380 additions and 287 deletions
+19 -1
View File
@@ -3,7 +3,6 @@
# A Ruby re-creation of /rdb, the relational database tools Mark Williams
# Company sold for COHERENT (~1991).
require 'bigdecimal'
require 'open3'
require 'date'
require 'tmpdir'
@@ -33,6 +32,25 @@ module Rdb
hits.first
end
# Exact decimal arithmetic with Rational (core Ruby, so bin/rdb can start
# without RubyGems): 0.1 + 0.2 is 0.3 and money adds up to the cent.
def decimal(str)
s = str.to_s.strip
return 0r if s.empty?
Rational(s.match?(NUM) ? s.sub(/\.\z/, '') : s.to_f.to_s)
end
# num with dec places, rounded half up ("%.2f" rounds the binary value).
def fixed(num, dec)
r = num.is_a?(Float) ? Rational(num.to_s) : num.to_r
r = r.round(dec, half: :up)
return r.to_i.to_s if dec.zero?
digits = (r.abs * 10**dec).to_i.to_s.rjust(dec + 1, '0')
"#{'-' if r.negative?}#{digits[0...-dec]}.#{digits[-dec..]}"
end
def die(msg)
abort "#{File.basename($PROGRAM_NAME)}: #{msg}"
end