From: David Kastrup Date: Thu, 28 Jun 2012 18:51:55 +0000 (+0200) Subject: Include +inf.0 and -inf.0 in conversions of Rational to SCM and back X-Git-Tag: release/2.15.41-1^2~1 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;ds=sidebyside;h=733f5e6a27700483ee3e1b1ea791a86f30f708ce;p=lilypond.git Include +inf.0 and -inf.0 in conversions of Rational to SCM and back --- diff --git a/lily/include/lily-guile.hh b/lily/include/lily-guile.hh index 5bcd235e27..059e5aa0cc 100644 --- a/lily/include/lily-guile.hh +++ b/lily/include/lily-guile.hh @@ -97,7 +97,6 @@ SCM ly_hash2alist (SCM tab); SCM ly_hash_table_keys (SCM tab); SCM ly_assoc_prepend_x (SCM alist, SCM key, SCM val); -inline bool ly_is_fraction (SCM x) { return SCM_FRACTIONP (x) || scm_is_integer (x); } inline bool ly_is_list (SCM x) { return scm_is_true (scm_list_p (x)); } inline bool ly_cheap_is_list (SCM x) { return scm_is_pair (x) || x == SCM_EOL; } diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc index 7985b35d90..6ddcad079b 100644 --- a/lily/lily-guile.cc +++ b/lily/lily-guile.cc @@ -580,6 +580,12 @@ robust_scm2vsize (SCM k, vsize o) SCM ly_rational2scm (Rational r) { + if (r.is_infinity ()) + if (r > Rational(0)) + return scm_inf (); + else + return scm_difference (scm_inf (), SCM_UNDEFINED); + return scm_divide (scm_from_int64 (r.numerator ()), scm_from_int64 (r.denominator ())); } @@ -587,6 +593,22 @@ ly_rational2scm (Rational r) Rational ly_scm2rational (SCM r) { + if (scm_is_true (scm_inf_p (r))) + { + if (scm_is_true (scm_positive_p (r))) + { + Rational r; + r.set_infinite (1); + return r; + } + else + { + Rational r; + r.set_infinite (-1); + return r; + } + } + return Rational (scm_to_int64 (scm_numerator (r)), scm_to_int64 (scm_denominator (r))); } @@ -594,7 +616,9 @@ ly_scm2rational (SCM r) Rational robust_scm2rational (SCM n, Rational rat) { - if (ly_is_fraction (n)) + if (scm_is_real (n) + && (scm_is_true (scm_exact_p (n)) + || scm_is_true (scm_inf_p (n)))) return ly_scm2rational (n); else return rat;