read: Accept "\(" in string literals.
authorMark H Weaver <mhw@netris.org>
Thu, 2 Oct 2014 00:45:41 +0000 (20:45 -0400)
committerMark H Weaver <mhw@netris.org>
Thu, 2 Oct 2014 01:00:23 +0000 (21:00 -0400)
Suggested by David Kastrup <dak@gnu.org> in <http://bugs.gnu.org/13644>.

* libguile/read.c (scm_read_string_like_syntax): Accept "\(" as
  equivalent to "(".
* doc/ref/api-data.texi (String Syntax): Document it.
* test-suite/tests/reader.test ("reading"): Add test.

doc/ref/api-data.texi
libguile/read.c
test-suite/tests/reader.test

index c1dd761..d98c938 100644 (file)
@@ -1,7 +1,7 @@
 @c -*-texinfo-*-
 @c This is part of the GNU Guile Reference Manual.
-@c Copyright (C)  1996, 1997, 2000, 2001, 2002, 2003, 2004, 2006, 2007,
-@c   2008, 2009, 2010, 2011, 2012, 2013, 2014  Free Software Foundation, Inc.
+@c Copyright (C)  1996, 1997, 2000-2004, 2006-2014
+@c   Free Software Foundation, Inc.
 @c See the file guile.texi for copying conditions.
 
 @node Simple Data Types
@@ -2999,6 +2999,10 @@ Backspace character (ASCII 8).
 @item @nicode{\0}
 NUL character (ASCII 0).
 
+@item @nicode{\(}
+Open parenthesis.  This is intended for use at the beginning of lines in
+multiline strings to avoid confusing Emacs lisp modes.
+
 @item @nicode{\} followed by newline (ASCII 10)
 Nothing.  This way if @nicode{\} is the last character in a line, the
 string will continue with the first character from the next line,
index 419ad12..60a40d9 100644 (file)
@@ -1,5 +1,5 @@
-/* Copyright (C) 1995, 1996, 1997, 1999, 2000, 2001, 2003, 2004, 2006,
- *   2007, 2008, 2009, 2010, 2011, 2012, 2014 Free Software Foundation, Inc.
+/* Copyright (C) 1995-1997, 1999-2001, 2003, 2004, 2006-2012, 2014
+ *   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
@@ -635,6 +635,9 @@ scm_read_string_like_syntax (int chr, SCM port, scm_t_read_opts *opts)
               goto str_eof;
             case '|':
             case '\\':
+            case '(':  /* Accept "\(" for use at the beginning of lines
+                         in multiline strings to avoid confusing emacs
+                         lisp modes.  */
               break;
             case '\n':
               if (opts->hungry_eol_escapes_p)
index 18c0293..9055e3b 100644 (file)
@@ -1,7 +1,8 @@
 ;;;; reader.test --- Reader test.    -*- coding: iso-8859-1; mode: scheme -*-
 ;;;;
-;;;; Copyright (C) 1999, 2001, 2002, 2003, 2007, 2008, 2009, 2010, 2011,
-;;;;   2014 Free Software Foundation, Inc.
+;;;; Copyright (C) 1999, 2001-2003, 2007-2011, 2014
+;;;;   Free Software Foundation, Inc.
+;;;;
 ;;;; Jim Blandy <jimb@red-bean.com>
 ;;;;
 ;;;; This library is free software; you can redistribute it and/or
       "a|b"
     (read-string "\"a\\|b\""))
 
+  (pass-if-equal "'(' in string literals"
+      "a(b"
+    (read-string "\"a\\(b\""))
+
   (pass-if-equal "#\\escape"
       '(a #\esc b)
     (read-string "(a #\\escape b)"))