~ chicken-core (chicken-5) a86ed010d019e6dafa98d6af94e40a44a6bef983
commit a86ed010d019e6dafa98d6af94e40a44a6bef983
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Wed Sep 12 22:25:54 2012 +0200
Commit: Peter Bex <peter.bex@xs4all.nl>
CommitDate: Fri Sep 14 20:44:28 2012 +0200
Detect keywords that start with numbers or dot correctly.
This was reported by Moritz and Christian and was caused by
using the wrong internal token-reader function when a token
started with a digit or #\. - this implies the #\. inside
a dotted list.
Signed-off-by: Peter Bex <peter.bex@xs4all.nl>
diff --git a/library.scm b/library.scm
index 76eb046f..bb30f392 100644
--- a/library.scm
+++ b/library.scm
@@ -2553,15 +2553,20 @@ EOF
(starting-line "missing list terminator")
end) ) ]
[else
- (let* ((tok (##sys#string-append "." (r-token)))
- (n (and (char-numeric? c2)
- (##sys#string->number tok)))
- (val (or n (build-symbol tok)))
- (node (cons val '())) )
- (if first
- (##sys#setslot last 1 node)
- (set! first node) )
- (loop node) ) ] ) ) )
+ (r-xtoken
+ (lambda (tok kw)
+ (let* ((tok (##sys#string-append "." tok))
+ (val
+ (if kw
+ (build-keyword tok)
+ (or (and (char-numeric? c2)
+ (##sys#string->number tok))
+ (build-symbol tok))))
+ (node (cons val '())) )
+ (if first
+ (##sys#setslot last 1 node)
+ (set! first node) )
+ (loop node) ))) ] ) ) )
(else
(let ([node (cons (readrec) '())])
(if first
@@ -2582,22 +2587,25 @@ EOF
(define (r-number radix exactness)
(set! rat-flag #f)
- (let ((tok (r-token)))
- (cond
- ((string=? tok ".")
- (##sys#read-error port "invalid use of `.'"))
- ((and (fx> (##sys#size tok) 0) (char=? (string-ref tok 0) #\#))
- (##sys#read-error port "unexpected prefix in number syntax" tok))
- (else
- (let ((val (##sys#string->number tok (or radix 10) exactness)) )
- (cond (val
- (when (and (##sys#inexact? val) (not (eq? exactness 'i)) rat-flag)
- (##sys#read-warning
- port
- "cannot represent exact fraction - coerced to flonum" tok) )
- val)
- (radix (##sys#read-error port "illegal number syntax" tok))
- (else (build-symbol tok)) ) ) ) ) ) )
+ (r-xtoken
+ (lambda (tok kw)
+ (cond (kw
+ (let ((s (build-keyword tok)))
+ (info 'symbol-info s (##sys#port-line port)) ))
+ ((string=? tok ".")
+ (##sys#read-error port "invalid use of `.'"))
+ ((and (fx> (##sys#size tok) 0) (char=? (string-ref tok 0) #\#))
+ (##sys#read-error port "unexpected prefix in number syntax" tok))
+ (else
+ (let ((val (##sys#string->number tok (or radix 10) exactness)) )
+ (cond (val
+ (when (and (##sys#inexact? val) (not (eq? exactness 'i)) rat-flag)
+ (##sys#read-warning
+ port
+ "cannot represent exact fraction - coerced to flonum" tok) )
+ val)
+ (radix (##sys#read-error port "illegal number syntax" tok))
+ (else (build-symbol tok)) ) ) ) ) ) ))
(define (r-number-with-exactness radix)
(cond [(char=? #\# (##sys#peek-char-0 port))
diff --git a/tests/library-tests.scm b/tests/library-tests.scm
index c986ef16..c385c1be 100644
--- a/tests/library-tests.scm
+++ b/tests/library-tests.scm
@@ -300,6 +300,12 @@
(assert (string=? ":" (symbol->string (with-input-from-string ":||" read))))
(assert-fail (with-input-from-string "#:" read))
+(assert (keyword? (with-input-from-string "42:" read)))
+(assert (keyword? (with-input-from-string ".:" read)))
+
+(assert (equal? (cons 1 2) (with-input-from-string "(1 . 2)" read)))
+(assert (every keyword? (with-input-from-string "(42: abc: .: #:: ::)" read)))
+
;;; setters
Trap