[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[SCM] GNU M4 source repository branch, branch-1_4, updated. branch-cvs-r
From: |
Eric Blake |
Subject: |
[SCM] GNU M4 source repository branch, branch-1_4, updated. branch-cvs-readonly-54-g702a3fe |
Date: |
Sat, 16 Feb 2008 22:27:45 +0000 |
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU M4 source repository".
http://git.sv.gnu.org/gitweb/?p=m4.git;a=commitdiff;h=702a3fe3e8a61c0d4c6da09221559deeff43fabb
The branch, branch-1_4 has been updated
via 702a3fe3e8a61c0d4c6da09221559deeff43fabb (commit)
from 7319157ccd7cd65f72c0a456c3091252a13f558a (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 702a3fe3e8a61c0d4c6da09221559deeff43fabb
Author: Eric Blake <address@hidden>
Date: Sat Feb 16 14:39:41 2008 -0700
Add regression test for multi-character quote recursion.
* examples/foreach2.m4: Use $0 rather than spelling out name.
* examples/foreachq2.m4: Likewise.
* examples/forloop2.m4: Likewise.
* examples/hanoi.m4: Likewise.
* examples/trace.m4: Likewise.
* doc/m4.texinfo (Improved forloop): Document advantage of $0.
(Improved foreach): Adjust dump from file.
Signed-off-by: Eric Blake <address@hidden>
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 9 +++++++++
doc/m4.texinfo | 48 +++++++++++++++++++++++++++++++++++++++++++++---
examples/foreach2.m4 | 2 +-
examples/foreachq2.m4 | 2 +-
examples/forloop2.m4 | 2 +-
examples/hanoi.m4 | 4 ++--
examples/trace.m4 | 4 ++--
7 files changed, 61 insertions(+), 10 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 0baa3c1..76fcac3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
2008-02-16 Eric Blake <address@hidden>
+ Add regression test for multi-character quote recursion.
+ * examples/foreach2.m4: Use $0 rather than spelling out name.
+ * examples/foreachq2.m4: Likewise.
+ * examples/forloop2.m4: Likewise.
+ * examples/hanoi.m4: Likewise.
+ * examples/trace.m4: Likewise.
+ * doc/m4.texinfo (Improved forloop): Document advantage of $0.
+ (Improved foreach): Adjust dump from file.
+
Stage 15: return argv refs back to collect_arguments.
Collect an entire $@ reference at once rather than one argument at
a time, outside of quotes (but inside quotes, $@ is still
diff --git a/doc/m4.texinfo b/doc/m4.texinfo
index 32cb0a9..6172277 100644
--- a/doc/m4.texinfo
+++ b/doc/m4.texinfo
@@ -6987,7 +6987,7 @@ undivert(`forloop2.m4')dnl
@result{}# performs sanity check that FROM is larger than TO
@result{}# allows complex numerical expressions in TO and FROM
@result{}define(`forloop', `ifelse(eval(`($3) >= ($2)'), `1',
address@hidden `pushdef(`$1', eval(`$2'))_forloop(`$1',
address@hidden `pushdef(`$1', eval(`$2'))_$0(`$1',
@result{} eval(`$3'), `$4')popdef(`$1')')')
@result{}define(`_forloop',
@result{} `$3`'ifelse(indir(`$1'), `$2', `',
@@ -7006,6 +7006,48 @@ forloop(`i', `a', `b', `non-numeric bounds')
@result{}
@end example
+One other change to notice is that the improved version used @samp{_$0}
+rather than @samp{_foreach} to invoke the helper routine. In general,
+this is a good practice to follow, because then the set of macros can be
+uniformly transformed. The following example shows a transformation
+that doubles the current quoting and appends a suffix @samp{2} to each
+transformed macro. If @code{foreach} refers to the literal
address@hidden, then @code{foreach2} invokes @code{_foreach} instead of
+the intended @code{_foreach2}, and the mixing of quoting paradigms leads
+to an infinite recursion loop in this example.
+
address@hidden options: -L9
address@hidden status: 1
address@hidden examples
address@hidden
+$ @kbd{m4 -d -L 9 -I examples}
+define(`arg1', `$1')include(`forloop2.m4')include(`quote.m4')
address@hidden
+define(`double', `define(`$1'`2',
+ arg1(patsubst(dquote(defn(`$1')), `[`']', `\&\&')))')
address@hidden
+double(`forloop')double(`_forloop')defn(`forloop2')
address@hidden(eval(``($3) >= ($2)''), ``1'',
address@hidden ``pushdef(``$1'', eval(``$2''))_$0(``$1'',
address@hidden eval(``$3''), ``$4'')popdef(``$1'')'')
+forloop(i, 1, 5, `ifelse(')forloop(i, 1, 5, `)')
address@hidden
+changequote(`[', `]')changequote([``], [''])
address@hidden
+forloop2(i, 1, 5, ``ifelse('')forloop2(i, 1, 5, ``)'')
address@hidden
+changequote`'include(`forloop.m4')
address@hidden
+double(`forloop')double(`_forloop')defn(`forloop2')
address@hidden(``$1'', ``$2'')_forloop($@@)popdef(``$1'')
+forloop(i, 1, 5, `ifelse(')forloop(i, 1, 5, `)')
address@hidden
+changequote(`[', `]')changequote([``], [''])
address@hidden
+forloop2(i, 1, 5, ``ifelse('')forloop2(i, 1, 5, ``)'')
address@hidden:stdin:12: recursion limit of 9 exceeded, use -L<N> to change it
address@hidden example
+
Of course, it is possible to make even more improvements, such as
adding an optional step argument, or allowing iteration through
descending sequences. @acronym{GNU} Autoconf provides some of these
@@ -7068,7 +7110,7 @@ undivert(`foreachq2.m4')dnl
@result{}divert(`-1')
@result{}# foreachq(x, `item_1, item_2, ..., item_n', stmt)
@result{}# quoted list, improved version
address@hidden(`foreachq', `pushdef(`$1')_foreachq($@@)popdef(`$1')')
address@hidden(`foreachq', `pushdef(`$1')_$0($@@)popdef(`$1')')
@result{}define(`_arg1q', ``$1'')
@result{}define(`_rest', `ifelse(`$#', `1', `', `dquote(shift($@@))')')
@result{}define(`_foreachq', `ifelse(`$2', `', `',
@@ -7163,7 +7205,7 @@ undivert(`foreach2.m4')dnl
@result{}divert(`-1')
@result{}# foreach(x, (item_1, item_2, ..., item_n), stmt)
@result{}# parenthesized list, improved version
address@hidden(`foreach', `pushdef(`$1')_foreach(`$1',
address@hidden(`foreach', `pushdef(`$1')_$0(`$1',
@result{} (dquote(dquote_elt$2)), `$3')popdef(`$1')')
@result{}define(`_arg1', `$1')
@result{}define(`_foreach', `ifelse(`$2', `(`')', `',
diff --git a/examples/foreach2.m4 b/examples/foreach2.m4
index 4acf0c2..74d00fb 100644
--- a/examples/foreach2.m4
+++ b/examples/foreach2.m4
@@ -2,7 +2,7 @@ include(`quote.m4')dnl
divert(`-1')
# foreach(x, (item_1, item_2, ..., item_n), stmt)
# parenthesized list, improved version
-define(`foreach', `pushdef(`$1')_foreach(`$1',
+define(`foreach', `pushdef(`$1')_$0(`$1',
(dquote(dquote_elt$2)), `$3')popdef(`$1')')
define(`_arg1', `$1')
define(`_foreach', `ifelse(`$2', `(`')', `',
diff --git a/examples/foreachq2.m4 b/examples/foreachq2.m4
index 345ddfe..f57d3ed 100644
--- a/examples/foreachq2.m4
+++ b/examples/foreachq2.m4
@@ -2,7 +2,7 @@ include(`quote.m4')dnl
divert(`-1')
# foreachq(x, `item_1, item_2, ..., item_n', stmt)
# quoted list, improved version
-define(`foreachq', `pushdef(`$1')_foreachq($@)popdef(`$1')')
+define(`foreachq', `pushdef(`$1')_$0($@)popdef(`$1')')
define(`_arg1q', ``$1'')
define(`_rest', `ifelse(`$#', `1', `', `dquote(shift($@))')')
define(`_foreachq', `ifelse(`$2', `', `',
diff --git a/examples/forloop2.m4 b/examples/forloop2.m4
index f1bdf0e..41e0e16 100644
--- a/examples/forloop2.m4
+++ b/examples/forloop2.m4
@@ -4,7 +4,7 @@ divert(`-1')
# performs sanity check that FROM is larger than TO
# allows complex numerical expressions in TO and FROM
define(`forloop', `ifelse(eval(`($3) >= ($2)'), `1',
- `pushdef(`$1', eval(`$2'))_forloop(`$1',
+ `pushdef(`$1', eval(`$2'))_$0(`$1',
eval(`$3'), `$4')popdef(`$1')')')
define(`_forloop',
`$3`'ifelse(indir(`$1'), `$2', `',
diff --git a/examples/hanoi.m4 b/examples/hanoi.m4
index c4a80fc..d290866 100644
--- a/examples/hanoi.m4
+++ b/examples/hanoi.m4
@@ -6,10 +6,10 @@ define(`move', `Move one disk from `$1' to `$2'.
# _hanoi (cnt, from, to, aux)
define(`_hanoi', `ifelse(eval(`$1'<=1), 1, `move($2, $3)',
-`_hanoi(decr($1), $2, $4, $3)move($2, $3)_hanoi(decr($1), $4, $3, $2)')')
+`$0(decr($1), $2, $4, $3)move($2, $3)$0(decr($1), $4, $3, $2)')')
# hanoi (cnt)
-define(`hanoi', `_hanoi(`$1', source, destination, auxilliary)')
+define(`hanoi', `_$0(`$1', source, destination, auxilliary)')
# traceon(`move', `_hanoi', `decr')
divert`'dnl
diff --git a/examples/trace.m4 b/examples/trace.m4
index a79dbcd..92ce981 100644
--- a/examples/trace.m4
+++ b/examples/trace.m4
@@ -6,10 +6,10 @@ define(`move', `Move one disk from `$1' to `$2'.
# _hanoi (cnt, from, to, aux)
define(`_hanoi', `ifelse(eval(`$1'<=1), 1, `move($2, $3)',
-`_hanoi(decr($1), $2, $4, $3)move($2, $3)_hanoi(decr($1), $4, $3, $2)')')
+`$0(decr($1), $2, $4, $3)move($2, $3)$0(decr($1), $4, $3, $2)')')
# hanoi (cnt)
-define(`hanoi', `_hanoi(`$1', source, destination, auxilliary)')
+define(`hanoi', `_$0(`$1', source, destination, auxilliary)')
divert`'dnl
# Debugmode t
hooks/post-receive
--
GNU M4 source repository
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [SCM] GNU M4 source repository branch, branch-1_4, updated. branch-cvs-readonly-54-g702a3fe,
Eric Blake <=