add reader option for parsing [] as ().
authorAndy Wingo <wingo@pobox.com>
Fri, 15 Jan 2010 21:24:31 +0000 (22:24 +0100)
committerAndy Wingo <wingo@pobox.com>
Fri, 15 Jan 2010 21:31:23 +0000 (22:31 +0100)
* 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
libguile/read.c

index 40d40fb..f027b72 100644 (file)
@@ -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
index edcb6ed..a6fa4e9 100644 (file)
@@ -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 '"':