summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2010-01-15 22:24:31 +0100
committerAndy Wingo <wingo@pobox.com>2010-01-15 22:31:23 +0100
commit5afa815c9cd4550bf93181bc0ed0134aa83dfc5d (patch)
treec5b5eef9dbf40ff943c31e748310633cbbbbc1ce
parente1138ba1995f970083ad752f1ff8f71876483194 (diff)
downloadguile-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.h3
-rw-r--r--libguile/read.c11
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 '"':