Merge remote-tracking branch 'origin/stable-2.0'
authorMark H Weaver <mhw@netris.org>
Mon, 12 Aug 2013 02:46:22 +0000 (22:46 -0400)
committerMark H Weaver <mhw@netris.org>
Mon, 12 Aug 2013 02:46:22 +0000 (22:46 -0400)
1  2 
libguile/foreign.c
libguile/numbers.c
libguile/print.c
module/language/scheme/decompile-tree-il.scm
test-suite/tests/foreign.test

Simple merge
@@@ -9194,9 -9184,17 +9195,17 @@@ SCM_PRIMITIVE_GENERIC (scm_numerator, "
    else if (SCM_FRACTIONP (z))
      return SCM_FRACTION_NUMERATOR (z);
    else if (SCM_REALP (z))
-     return scm_exact_to_inexact (scm_numerator (scm_inexact_to_exact (z)));
+     {
+       double zz = SCM_REAL_VALUE (z);
+       if (zz == floor (zz))
+         /* Handle -0.0 and infinities in accordance with R6RS
+            flnumerator, and optimize handling of integers. */
+         return z;
+       else
+         return scm_exact_to_inexact (scm_numerator (scm_inexact_to_exact (z)));
+     }
    else
 -    SCM_WTA_DISPATCH_1 (g_scm_numerator, z, SCM_ARG1, s_scm_numerator);
 +    return scm_wta_dispatch_1 (g_scm_numerator, z, SCM_ARG1, s_scm_numerator);
  }
  #undef FUNC_NAME
  
@@@ -9211,10 -9209,17 +9220,18 @@@ SCM_PRIMITIVE_GENERIC (scm_denominator
    else if (SCM_FRACTIONP (z))
      return SCM_FRACTION_DENOMINATOR (z);
    else if (SCM_REALP (z))
-     return scm_exact_to_inexact (scm_denominator (scm_inexact_to_exact (z)));
+     {
+       double zz = SCM_REAL_VALUE (z);
+       if (zz == floor (zz))
+         /* Handle infinities in accordance with R6RS fldenominator, and
+            optimize handling of integers. */
+         return scm_i_from_double (1.0);
+       else
+         return scm_exact_to_inexact (scm_denominator (scm_inexact_to_exact (z)));
+     }
    else
 -    SCM_WTA_DISPATCH_1 (g_scm_denominator, z, SCM_ARG1, s_scm_denominator);
 +    return scm_wta_dispatch_1 (g_scm_denominator, z, SCM_ARG1,
 +                               s_scm_denominator);
  }
  #undef FUNC_NAME
  
Simple merge
               (primitive 'if)
               (recurse test) (recurse consequent) (recurse alternate))
  
 -            ((<sequence> exps) (primitive 'begin) (for-each recurse exps))
 +            ((<seq> head tail)
 +             (primitive 'begin) (recurse head) (recurse tail))
 +
              ((<lambda> body)
-              (if body (recurse body)))
+              (if body (recurse body) (primitive 'case-lambda)))
  
              ((<lambda-case> req opt rest kw inits gensyms body alternate)
               (primitive 'lambda)
Simple merge