~ chicken-core (chicken-5) e1b27335820dea4908e3e738f96c39f388c1ca01
commit e1b27335820dea4908e3e738f96c39f388c1ca01
Author: felix <felix@z.(none)>
AuthorDate: Mon Feb 28 23:17:11 2011 +0100
Commit: felix <felix@z.(none)>
CommitDate: Mon Feb 28 23:17:11 2011 +0100
octal escape sequences in strings; documented escape sequences
diff --git a/library.scm b/library.scm
index 5760774d..4e1aa1fb 100644
--- a/library.scm
+++ b/library.scm
@@ -2344,19 +2344,20 @@ EOF
(##sys#read-char-0 port)
(loop (##sys#peek-char-0 port)) ) ) ) )
- (define (r-usequence u n)
- (let loop ([seq '()] [n n])
+ (define (r-usequence u n base)
+ (let loop ((seq '()) (n n))
(if (eq? n 0)
- (let* ([str (##sys#reverse-list->string seq)]
- [n (string->number str 16)])
- (or n
- (##sys#read-error
- port
- (string-append "invalid escape-sequence '\\" u str "\'")) ) )
- (let ([x (##sys#read-char-0 port)])
- (if (or (eof-object? x) (char=? #\" x))
- (##sys#read-error port "unterminated string constant")
- (loop (cons x seq) (fx- n 1)) ) ) ) ) )
+ (let* ((str (##sys#reverse-list->string seq))
+ (n (string->number str base)))
+ (or n
+ (##sys#read-error
+ port
+ (string-append
+ "invalid escape-sequence '\\" u str "\'")) ) )
+ (let ((x (##sys#read-char-0 port)))
+ (if (or (eof-object? x) (char=? #\" x))
+ (##sys#read-error port "unterminated string constant")
+ (loop (cons x seq) (fx- n 1)) ) ) ) ) )
(define (r-cons-codepoint cp lst)
(let* ((s (##sys#char->utf8-string (integer->char cp)))
@@ -2381,10 +2382,10 @@ EOF
((#\v) (loop (##sys#read-char-0 port) (cons (integer->char 11) lst)))
((#\f) (loop (##sys#read-char-0 port) (cons (integer->char 12) lst)))
((#\x)
- (let ([ch (integer->char (r-usequence "x" 2))])
+ (let ([ch (integer->char (r-usequence "x" 2 16))])
(loop (##sys#read-char-0 port) (cons ch lst)) ) )
((#\u)
- (let ([n (r-usequence "u" 4)])
+ (let ([n (r-usequence "u" 4 16)])
(if (##sys#unicode-surrogate? n)
(if (and (eqv? #\\ (##sys#read-char-0 port))
(eqv? #\u (##sys#read-char-0 port)))
@@ -2404,11 +2405,15 @@ EOF
((#\\ #\' #\" #\|)
(loop (##sys#read-char-0 port) (cons c lst)))
(else
- (##sys#read-warning
- port
- "undefined escape sequence in string - probably forgot backslash"
- c)
- (loop (##sys#read-char-0 port) (cons c lst))) ) )
+ (cond ((char-numeric? c)
+ (let ((ch (integer->char (r-usequence "" 2 8))))
+ (loop (##sys#read-char-0 port) (cons ch lst)) ))
+ (else
+ (##sys#read-warning
+ port
+ "undefined escape sequence in string - probably forgot backslash"
+ c)
+ (loop (##sys#read-char-0 port) (cons )c lst))) ) ))
((eq? term c) (##sys#reverse-list->string lst))
(else (loop (##sys#read-char-0 port) (cons c lst))) ) ))
diff --git a/manual/Non-standard read syntax b/manual/Non-standard read syntax
index fa2f63ea..0cecce36 100644
--- a/manual/Non-standard read syntax
+++ b/manual/Non-standard read syntax
@@ -93,6 +93,27 @@ prints
and substituted expressions: (+ three 99) ==> 102
(three is "3")
+=== String escape sequences
+
+String-literals may contain the following of the escape sequences:
+
+<table>
+<tr><th>Escape sequence</th><th>Character</th></tr>
+<tr><td>\n</td><td>line feed / newline</td></tr>
+<tr><td>\t</td><td>tab</td></tr>
+<tr><td>\r</td><td>carriage return</td></tr>
+<tr><td>\b</td><td>backspace</td></tr>
+<tr><td>\a</td><td>bell</td></tr>
+<tr><td>\v</td><td>vertical tab</td></tr>
+<tr><td>\f</td><td>form feed</td></tr>
+<tr><td>\xXX</td><td>hexadecimal 8-bit character</td></tr>
+<tr><td>\uXXXX</td><td>hexadecimal 16-bit UNICODE character</td></tr>
+<tr><td>\UXXXXXXXX</td><td>hexadecimal 32-bit UNICODE character</td></tr>
+<tr><td>\OOO</td><td>octal 8-bit character</td></tr>
+<tr><td>\| \" \\ \'</td><td>represents escaped character</td></tr>
+</table>
+
+
=== Foreign Declare
#> ... <#
@@ -126,6 +147,7 @@ Interpretation depends on the directly following characters. Only the following
==== Read Mark Invocation
* If a ''read mark'' with the same name as the token is registered, then its procedure is called and the result of the read-mark procedure will be returned
+(see {{set-read-syntax!}} for more information about read-marks).
=== Case Sensitive Expression
Trap