m4-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

ensure we don't break m4_expand


From: Eric Blake
Subject: ensure we don't break m4_expand
Date: Sat, 27 Oct 2007 06:24:34 -0600
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070728 Thunderbird/2.0.0.6 Mnenhy/0.7.5.666

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

The recent autoconf addition of m4_expand exploits some pretty low-level
M4 magic, so I thought I'd better add a test to make sure we don't break
it.  As Paolo Bonzini so aptly stated [1], this (ab)use of changequote is
"Mindblowing."

[1] http://lists.gnu.org/archive/html/autoconf-patches/2007-10/msg00214.html

- --
Don't work too hard, make some time for fun as well!

Eric Blake             address@hidden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFHIy4B84KuGfSFAYARAuquAJ49MEeqYZgfTvI+e/virXclvWYYngCfY48d
q8lZS/GZdn2fWk1wLT1cVmw=
=FOpB
-----END PGP SIGNATURE-----
>From 85920dd1b26a268744d8da4d4e6d52843b77a36a Mon Sep 17 00:00:00 2001
From: Eric Blake <address@hidden>
Date: Sat, 27 Oct 2007 06:15:51 -0600
Subject: [PATCH] Document one use of changequote(`(',`)').

* doc/m4.texinfo (Changequote): Add new test, based on recent
autoconf addition of m4_expand.

Signed-off-by: Eric Blake <address@hidden>
(cherry picked from commit 37e491acd84f447920057b1619ebab148adea8b1)
---
 ChangeLog      |    6 ++++++
 doc/m4.texinfo |   28 ++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 4e9dcbc..6f56dee 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-10-27  Eric Blake  <address@hidden>
+
+       Document one use of changequote(`(',`)').
+       * doc/m4.texinfo (Changequote): Add new test, based on recent
+       autoconf addition of m4_expand.
+
 2007-10-24  Ralf Wildenhues  <address@hidden>
 
        * Makefile.am (dist_pkgdata_DATA): Add examples/capitalize2.m4.
diff --git a/doc/m4.texinfo b/doc/m4.texinfo
index 5cedc18..f84f4d3 100644
--- a/doc/m4.texinfo
+++ b/doc/m4.texinfo
@@ -4074,6 +4074,34 @@ echo(hi,hi)bye)
 @result{}1:HIhibye:
 @end example
 
+However, if you are not worried about portability, using @samp{(} and
address@hidden)} as quoting characters has an interesting property---you can use
+it to compute a quoted string containing the expansion of any quoted
+text, as long as the expansion results in both balanced quotes and
+balanced parentheses.  The trick is realizing @code{expand} uses
address@hidden unquoted, to trigger its expansion using the normal quoting
+characters, but uses extra parentheses to group unquoted commas that
+occur in the expansion without consuming whitespace following those
+commas.  Then @code{_expand} uses @code{changequote} to convert the
+extra parentheses back into quoting characters.  Note that it takes two
+more @code{changequote} invocations to restore the original quotes.
+Contrast the behavior on whitespace when using @samp{$*}, via
address@hidden, to attempt the same task.
+
address@hidden
+changequote(`[', `]')dnl
+define([a], [1, (b)])dnl
+define([b], [2])dnl
+define([quote], [[$*]])dnl
+define([expand], [_$0(($1))])dnl
+define([_expand],
+  [changequote([(], [)])$1changequote`'changequote(`[', `]')])dnl
+expand([a, a, [a, a], [[a, a]]])
address@hidden, (2), 1, (2), a, a, [a, a]
+quote(a, a, [a, a], [[a, a]])
address@hidden,(2),1,(2),a, a,[a, a]
address@hidden example
+
 If @var{end} is a prefix of @var{start}, the end-quote will be
 recognized in preference to a nested begin-quote.  In particular,
 changing the quotes to have the same string for @var{start} and
-- 
1.5.3.2


reply via email to

[Prev in Thread] Current Thread [Next in Thread]