[Top][All Lists]

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

the need for qindir [was: 2.62 AT_SETUP limitations]

From: Eric Blake
Subject: the need for qindir [was: 2.62 AT_SETUP limitations]
Date: Thu, 24 Apr 2008 06:29:33 -0600
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv: Gecko/20080213 Thunderbird/ Mnenhy/

Hash: SHA1

According to Akim Demaille on 4/24/2008 3:20 AM:

[dropping bug-bison, adding m4-discuss]

|> Really, the problem is
|> that there is no way to determine whether $1 is safe to expand, short of
|> expanding $1; thus, if it was not safe, you've already screwed up the
|> state of the m4 parsing.
| I always felt m4 lacks an "eval" macro.  Not the one for arithmetics,
| but one which would run m4 on its argument, and return the expansion
| quoted.  This is what tried to do m4_quote/m4_dquote, but it's fragile.
| There are really two sort of macros.  Those which really work on the
| text, and you do not want to evaluate the result.  This is where
| regexp, patsubst etc. live.  And there are the regular just-expanding
| macros.

And macros such as substr are practically worthless as is in a harsh
environment - they operate on text and return an unquoted result, which is
almost never what you want if you don't want the result immediately expanded.

| For the latter, a usual single-level of quotation is fine.  For the
| former, we need two.  And we have no safe means to go from one model
| to the other, between text-hacking macros and text-expanding macros.
| Something like a new primitive "eval and return quoted" would fill
| the gap.
| Well, at least that's what I believed years ago :)

Yes, m4 has a TODO item about adding the qindir builtin (and which I will
probably do for m4 1.6).  The original request mentioned making it robust
even in the face of unbalanced quotes inside the text, but I don't know if
I can make the m4 machinery do that.  But I can quite easily make it
behave exactly like indir except for the addition of an additional level
of quotes in the output.  Then you will have (in m4sugar quoting):

m4_define([m4_qsubstr], [m4_qindir([m4_substr], $@)])

such that

m4_define([b], [HI])
m4_substr([abc], [1], [1])
=> HI
m4_qsubstr([abc], [1], [1])
=> b

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

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


reply via email to

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