From 5afa815c9cd4550bf93181bc0ed0134aa83dfc5d Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Fri, 15 Jan 2010 22:24:31 +0100 Subject: [PATCH] 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 [. --- libguile/private-options.h | 3 ++- 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 '"':