diff options
author | Andy Wingo <wingo@pobox.com> | 2010-01-15 22:24:31 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2010-01-15 22:31:23 +0100 |
commit | 5afa815c9cd4550bf93181bc0ed0134aa83dfc5d (patch) | |
tree | c5b5eef9dbf40ff943c31e748310633cbbbbc1ce | |
parent | e1138ba1995f970083ad752f1ff8f71876483194 (diff) | |
download | guile-5afa815c9cd4550bf93181bc0ed0134aa83dfc5d.tar.gz |
add reader option for parsing [] as ().
* libguile/private-options.h:
* libguile/read.c (scm_read_opts, SCM_SQUARE_BRACKETS_P): Add an option
for treating [ and ] as parentheses, on by default. Note that this
makes them delimiters also, so [ and ] cannot appear in a symbol name,
with this read option on.
(scm_read_sexp): If we start with [, we end with ].
(scm_read_expression): Add case for [.
-rw-r--r-- | libguile/private-options.h | 3 | ||||
-rw-r--r-- | libguile/read.c | 11 |
2 files changed, 11 insertions, 3 deletions
diff --git a/libguile/private-options.h b/libguile/private-options.h index 40d40fbd7..f027b72e6 100644 --- a/libguile/private-options.h +++ b/libguile/private-options.h @@ -4,7 +4,7 @@ * We put this in a private header, since layout of data structures * is an implementation detail that we want to hide. * - * Copyright (C) 2007, 2009 Free Software Foundation, Inc. + * Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -96,6 +96,7 @@ SCM_API scm_t_option scm_read_opts[]; #define SCM_ESCAPED_PARENS_P scm_read_opts[5].val #endif #define SCM_R6RS_ESCAPES_P scm_read_opts[6].val +#define SCM_SQUARE_BRACKETS_P scm_read_opts[7].val #if SCM_ENABLE_ELISP #define SCM_N_READ_OPTIONS 7 diff --git a/libguile/read.c b/libguile/read.c index edcb6ed1d..a6fa4e95b 100644 --- a/libguile/read.c +++ b/libguile/read.c @@ -78,6 +78,8 @@ scm_t_option scm_read_opts[] = { #endif { SCM_OPTION_BOOLEAN, "r6rs-hex-escapes", 0, "Use R6RS variable-length character and string hex escapes."}, + { SCM_OPTION_BOOLEAN, "square-brackets", 1, + "Treat `[' and `]' as parentheses, for R6RS compatibility."}, { 0, }, }; @@ -173,7 +175,8 @@ static SCM *scm_read_hash_procedures; structure''). */ #define CHAR_IS_R5RS_DELIMITER(c) \ (CHAR_IS_BLANK (c) \ - || (c == ')') || (c == '(') || (c == ';') || (c == '"')) + || (c == ')') || (c == '(') || (c == ';') || (c == '"') \ + || (SCM_SQUARE_BRACKETS_P && ((c == '[') || (c == ']')))) #define CHAR_IS_DELIMITER CHAR_IS_R5RS_DELIMITER @@ -332,7 +335,7 @@ scm_read_sexp (scm_t_wchar chr, SCM port) register SCM tmp; register SCM tl, ans = SCM_EOL; SCM tl2 = SCM_EOL, ans2 = SCM_EOL, copy = SCM_BOOL_F; - static const int terminating_char = ')'; + const int terminating_char = ((chr == '[') ? ']' : ')'); /* Need to capture line and column numbers here. */ long line = SCM_LINUM (port); @@ -1251,6 +1254,10 @@ scm_read_expression (SCM port) case ';': (void) scm_read_semicolon_comment (chr, port); break; + case '[': + if (!SCM_SQUARE_BRACKETS_P) + return (scm_read_mixed_case_symbol (chr, port)); + /* otherwise fall through */ case '(': return (scm_read_sexp (chr, port)); case '"': |