Fix core:car, core:cdr for specials.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 25 Dec 2016 23:14:28 +0000 (00:14 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 4 Jan 2017 08:12:16 +0000 (09:12 +0100)
* mes.c (car_, cdr_): Return special.  Fixes string->list, returning nil.
* tests/scm.test ("string-length", "string->list"): New tests.

mes.c
tests/scm.test

diff --git a/mes.c b/mes.c
index f3d22f950e708078222e15f623bb2383e81983f5..a506102f6386ab11336628bd024c0a608ae5c230 100644 (file)
--- a/mes.c
+++ b/mes.c
@@ -246,6 +246,7 @@ car_ (SCM x)
 {
   return (TYPE (CAR (x)) == PAIR
           || TYPE (CAR (x)) == REF
+          || TYPE (CAR (x)) == SPECIAL
           || TYPE (CAR (x)) == SYMBOL
           || TYPE (CAR (x)) == STRING) ? CAR (x) : MAKE_NUMBER (CAR (x));
 }
@@ -255,6 +256,7 @@ cdr_ (SCM x)
 {
   return (TYPE (CDR (x)) == PAIR
           || TYPE (CDR (x)) == REF
+          || TYPE (CAR (x)) == SPECIAL
           || TYPE (CDR (x)) == SYMBOL
           || TYPE (CDR (x)) == STRING) ? CDR (x) : MAKE_NUMBER (CDR (x));
 }
index a000aa5467a95d592445a178763e1f5a77d8a312..2b4728edcfa956178c7d2b04b31be9923062b02b 100755 (executable)
@@ -68,13 +68,24 @@ exit $?
 (pass-if "=" (seq? 3 '3))
 (pass-if "= 2" (not (= 3 '4)))
 
+(pass-if-equal "string-length"
+    0
+    (string-length ""))
+(pass-if-equal "string-length 2"
+    3
+  (string-length (string-append "a" "b" "c")))
+(pass-if-equal "string->list"
+    '()
+    (string->list ""))
+(pass-if-equal "string->list 2"
+    '(#\a #\b #\c #\newline)
+  (string->list "abc\n"))
+
 (pass-if "string-append" (sequal? (string-append "a" "b" "c") "abc"))
 (pass-if "substring" (sequal? (substring "hello world" 6) "world"))
 (pass-if "substring 2" (sequal? (substring "hello world" 4 7) "o w"))
 (pass-if "string-ref" (seq? (string-ref "hello world" 4) #\o))
 (pass-if "eq?" (not (eq? (string-append "a" "b" "c") "abc")))
-(pass-if "string-length" (seq? (string-length (string-append "a" "b" "c")) 3))
-(pass-if-equal "string->list" '(#\a #\b #\c #\newline) (string->list "abc\n"))
 (pass-if "char" (seq? (char->integer #\A) 65))
 (pass-if "char 2" (seq? (char->integer #\101) (char->integer #\A)))
 (pass-if "char 3" (seq? (integer->char 10) #\newline))