nil is false, whee
authorAndy Wingo <wingo@pobox.com>
Tue, 23 Mar 2010 19:23:19 +0000 (20:23 +0100)
committerAndy Wingo <wingo@pobox.com>
Tue, 30 Mar 2010 08:31:27 +0000 (10:31 +0200)
* libguile/boolean.h (scm_is_false): Recognize nil as false, by default.
  (scm_is_bool): Recognize nil as a boolean.

* libguile/boolean.c (scm_not, scm_boolean, scm_to_bool, scm_is_bool):
  Adapt to treat nil as false.

* libguile/vm-i-system.c (br-if, br-if-not): Just use scm_is_false
  instead of specifically mentioning nil.

libguile/boolean.c
libguile/boolean.h
libguile/vm-i-system.c

index 3391d6ce526a52353b8b342a364fbcb116e4053a..7d58582a27d206c5119bbe41748d0b79dbdb7370 100644 (file)
@@ -56,28 +56,27 @@ verify (SCM_VALUES_DIFFER_IN_EXACTLY_TWO_BIT_POSITIONS              \
 
 SCM_DEFINE (scm_not, "not", 1, 0, 0, 
             (SCM x),
-            "Return @code{#t} iff @var{x} is @code{#f}, else return @code{#f}.")
+            "Return @code{#t} iff @var{x} is false, else return @code{#f}.")
 #define FUNC_NAME s_scm_not
 {
-  return scm_from_bool (scm_is_false_or_nil (x));
+  return scm_from_bool (scm_is_false (x));
 }
 #undef FUNC_NAME
 
 
 SCM_DEFINE (scm_boolean_p, "boolean?", 1, 0, 0, 
            (SCM obj),
-            "Return @code{#t} iff @var{obj} is either @code{#t} or @code{#f}.")
+            "Return @code{#t} iff @var{obj} is @code{#t} or false.")
 #define FUNC_NAME s_scm_boolean_p
 {
-  return scm_from_bool (scm_is_bool_or_nil (obj));
+  return scm_from_bool (scm_is_bool (obj));
 }
 #undef FUNC_NAME
 
 int
 scm_to_bool (SCM x)
 {
-  /* XXX Should this first test use scm_is_false_or_nil instead? */
-  if (scm_is_eq (x, SCM_BOOL_F))
+  if (scm_is_false (x))
     return 0;
   else if (scm_is_eq (x, SCM_BOOL_T))
     return 1;
@@ -93,7 +92,7 @@ int
 scm_is_bool (SCM obj)
 {
   /* This must match the macro definition of `scm_is_bool ()'.  */
-  return scm_is_bool_and_not_nil (obj);
+  return scm_is_bool_or_nil (obj);
 }
 
 \f
index bc108f5c33dc3a34122b8a9c7f3dbcee3b8f7ad0..007500e10a428b9937d72c3cee6e48d6f9112232 100644 (file)
@@ -27,7 +27,9 @@
 
 \f
 
-/* Boolean Values 
+/* Boolean Values. Obviously there are #t and #f, but there is also nil to deal
+ * with. We choose to treat nil as a false boolean. All options might silently
+ * break existing code, but this one seems most responsible.
  *
  */ 
 
@@ -58,8 +60,8 @@
 #endif
 #define scm_is_true_and_not_nil(x) (!scm_is_false_or_nil (x))
 
-/* XXX Should these macros treat %nil as false by default? */
-#define scm_is_false(x)  (scm_is_false_and_not_nil (x))
+/* %nil is false. */
+#define scm_is_false(x)  (scm_is_false_or_nil (x))
 #define scm_is_true(x)   (!scm_is_false (x))
 
 /*
@@ -90,8 +92,7 @@
 
 SCM_API int scm_is_bool (SCM);
 
-/* XXX Should scm_is_bool treat %nil as a boolean? */
-#define scm_is_bool(x)   (scm_is_bool_and_not_nil (x))
+#define scm_is_bool(x)   (scm_is_bool_or_nil (x))
 
 #define scm_from_bool(x) ((x) ? SCM_BOOL_T : SCM_BOOL_F)
 SCM_API int scm_to_bool (SCM x);
index 27c6c3374e075ef231eebd585961d79ce02f1aeb..76ae0691df5072389a156b9bdede8b161bb038ec 100644 (file)
@@ -484,12 +484,12 @@ VM_DEFINE_INSTRUCTION (35, br, "br", 3, 0, 0)
 
 VM_DEFINE_INSTRUCTION (36, br_if, "br-if", 3, 0, 0)
 {
-  BR (scm_is_true_and_not_nil (*sp));
+  BR (scm_is_true (*sp));
 }
 
 VM_DEFINE_INSTRUCTION (37, br_if_not, "br-if-not", 3, 0, 0)
 {
-  BR (scm_is_false_or_nil (*sp));
+  BR (scm_is_false (*sp));
 }
 
 VM_DEFINE_INSTRUCTION (38, br_if_eq, "br-if-eq", 3, 0, 0)