diff options
author | Andy Wingo <wingo@pobox.com> | 2011-07-01 12:20:52 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2011-07-01 12:20:52 +0200 |
commit | 1f7945a768a8df06ad208ed2846dfe4f92e1515a (patch) | |
tree | 9ccebc38507d0c6eca051fedc7c3cea70dabad69 | |
parent | b8441577f9954053a90981a5c134aa43f341f712 (diff) | |
download | guile-1f7945a768a8df06ad208ed2846dfe4f92e1515a.tar.gz |
fix '(a #{.} b)
* libguile/read.c (scm_read_sexp): Don't confuse `#{.}#' with `.' for
the purpose of reading dotted pairs. Thanks to CRLF0710 for the
report.
* test-suite/tests/reader.test ("#{}#"): Add test.
-rw-r--r-- | libguile/read.c | 11 | ||||
-rw-r--r-- | test-suite/tests/reader.test | 1 |
2 files changed, 9 insertions, 3 deletions
diff --git a/libguile/read.c b/libguile/read.c index 4d22ead8a..ee50fb4a3 100644 --- a/libguile/read.c +++ b/libguile/read.c @@ -376,8 +376,12 @@ scm_read_sexp (scm_t_wchar chr, SCM port) return SCM_EOL; scm_ungetc (c, port); - if (scm_is_eq (scm_sym_dot, - (tmp = scm_read_expression (port)))) + tmp = scm_read_expression (port); + + /* Note that it is possible for scm_read_expression to return + scm_sym_dot, but not as part of a dotted pair: as in #{.}#. So + check that it's a real dot by checking `c'. */ + if (c == '.' && scm_is_eq (scm_sym_dot, tmp)) { ans = scm_read_expression (port); if (terminating_char != (c = flush_ws (port, FUNC_NAME))) @@ -401,7 +405,8 @@ scm_read_sexp (scm_t_wchar chr, SCM port) scm_ungetc (c, port); tmp = scm_read_expression (port); - if (scm_is_eq (scm_sym_dot, tmp)) + /* See above note about scm_sym_dot. */ + if (c == '.' && scm_is_eq (scm_sym_dot, tmp)) { SCM_SETCDR (tl, tmp = scm_read_expression (port)); diff --git a/test-suite/tests/reader.test b/test-suite/tests/reader.test index f350e73a6..437706b00 100644 --- a/test-suite/tests/reader.test +++ b/test-suite/tests/reader.test @@ -428,6 +428,7 @@ (with-test-prefix "#{}#" (pass-if (equal? (read-string "#{}#") '#{}#)) + (pass-if (not (equal? (read-string "(a #{.}# b)") '(a . b)))) (pass-if (equal? (read-string "#{a}#") 'a)) (pass-if (equal? (read-string "#{a b}#") '#{a b}#)) (pass-if-exception "#{" exception:eof-in-symbol |