This seems to do the trick in a different way:

<assign|enclose|<xmacro|w|<quasiquote|<xmacro|x|<with|<unquote*|<quote-arg|w>>|<map-args|identity|eval|x>>>>>>

Which really means only the first argument is any use... but it could be a
concat which contains other macro calls...

This attempt to preserve the old (less useful?) intention:
<assign|enclose|<xmacro|w|<quasiquote|<xmacro|x|<with|<unquote*|<quote-arg|w>>|<map-args|identity|<arg|x|0>|x|1>>>>>>

just emits: <error|invalid map arguments>
when called with: <tc|merge|a|b|c>

but I don't see why.

Anyway, so my closure-making enclose macro is:
<assign|enclose|<xmacro|w|<quasiquote|<macro|x|<with|<unquote*|<quote-arg|w>>|<arg|x>>>>>>

Next question. Why does texmacs segfault when trying to get the number of
arguments to an xmacro. length when applied to the argument segfaults?
<length|<quote-arg|w>> returns error-bad length

This works: <length|<tuple|<unquote*|<quote-arg|w>>>> (to my surprise
without the need for quasi, so I learned something there - quasi just makes
it happen earlier)

EVEN MORE interesting: <get-label|<quote-arg|w>> will return the NAME of
the macro being executed! How's that for sneakiness! Oh yes!


On Thu, May 24, 2012 at 8:37 AM, Sam Liddicott <s...@liddicott.com> wrote:

> I tried some unquote quote as an attempt preserve something past the first
> quasi. The unquote should cause the quote to be evaluated which removes the
> quote and leaves things as they were
>
>
> <assign|enclose|<xmacro|w|<quasi|<xmacro|x|<quasi|<with|<unquote*|<quote-arg|w>>|<unquote|<quote|<compound|<unquote*|<quote-arg|x>>>>>>>>>>>
>
> Using compound (above) I got a segfault, using eval (below) instead (which
> seemed to work when substituted in the simpler incomplete) cases emits: bad
> eval bridge
>
> <assign|enclose|<xmacro|w|<quasi|<xmacro|x|<quasi|<with|<unquote*|<quote-arg|w>>|<unquote|<quote|<eval|<unquote*|<quote-arg|x>>>>>>>>>>>
>
>
>
> On Thu, May 24, 2012 at 8:25 AM, Sam Liddicott <s...@liddicott.com> wrote:
>
>> I thought I'd try implementing closures in texmacs macros instead.
>>
>> I want a macro that can be provided a list of variables and produce a new
>> macro that is a "with" block of those variables, and then evaluates the
>> parameters.
>>
>> The produced macro would be of this form (although possibly I would use
>> eval instead of compound):
>> <xmacro|x|<with|...|...|<quasi|<compound|<unquote*|<quote-arg|x>>>>>>
>>
>> It seems it would work as this example shows:
>> <xmacro|x|<with|a|AHA|<quasi|<compound|<unquote*|<quote-arg|x>>>>>>
>>
>> The producing macro must fill in ... according to the arguments it is
>> passed, indicating the variables and their values to be preserved.
>>
>> My first attempt at the constructing macro is:
>>
>> <assign|enclose|<xmacro|w|<quasi|<xmacro|x|<quasi|<with|<unquote*|<quote-arg|w>>|<compound|<unquote*|<quote-arg|x>>>>>>>>>
>>
>> Note the nested quasi. I need the first unquote* to be expanded by the
>> first quasi, and the second quasi to be preserved along with the second
>> unquote*, but nesting makes this hard, because the first quasi encloses the
>> second quasi which encloses both unquote*
>>
>>
>> <assign|enclose|<xmacro|w|<quasi|<xmacro|x|<with|<unquote*|<quote-arg|w>>|<quote|<quasi|<compound|<unquote*|<quote-arg|x>>>>>>>>>>
>>
>> otherwise the idea works as this hard-wired version shows:
>> <assign|enclose|<xmacro|w|<quasi|<xmacro|x|<with|<unquote*|<quote-arg|w>>|Hello
>>  <value|a>
>> there>>>>>
>>
>> That hard wired version fixes the body, and can be executed with:
>> <assign|tc|<enclose|a|HEE HEE>>
>> <tc>
>>
>> I tried deferring the body execution into an xcompound macro, like this:
>> <assign|xcompound|<xmacro|x|<quasi|<compound|<unquote*|<quote-arg|x>>>>>>
>>
>>
>> <assign|enclose|<xmacro|w|<quasi|<xmacro|x|<with|<unquote*|<quote-arg|w>>|<xcompound|<arg|x>>>>>>>
>>
>> But then texmacs just segfaults. I guess to call xcompound still needs to
>> be using quasi unquote* quote-arg
>>
>> Can anyone help me preserve SECOND quasi and unquote* in the emitted
>> macro while still allowing the FIRST unquote* in the with block to be
>> expanded?
>>
>> Sam
>>
>
>
_______________________________________________
Texmacs-dev mailing list
Texmacs-dev@gnu.org
https://lists.gnu.org/mailman/listinfo/texmacs-dev

Reply via email to