I think the problem is that I'm not accessing it directly through the macro
parameters. The call:
@grammar foo begin ... end
passes just the single expression block to `foo`. Thus, I'm getting the
function from the resulting Expr tree. Even if I quote it, it still ends up
as an expression that contains a symbol that must be evaluated (unless I'm
missing something...)
On Friday, August 1, 2014 11:42:52 AM UTC-4, Simon Kornblith wrote:
>
> That looks like the output of :(esc(fn)), but you don't want to quote
> that, you want to evaluate it when generating the code, i.e. use
> $(esc(fn)) wherever you were previously using $fn
>
> On Friday, August 1, 2014 11:38:44 AM UTC-4, Abe Schneider wrote:
>>
>> That's correct, I'm generating code that keeps a pointer to that function
>> to call later on.
>>
>> If I do that, I have the type `esc(fn)` in the macro (this is what I get
>> when printing it out), and taking a dump of that argument gives:
>>
>> Expr
>> head: Symbol call
>> args: Array(Any,(2,))
>> 1: Symbol esc
>> 2: Symbol fn
>> typ: Any
>>
>>
>> Does that mean instead of carrying around a function I will need to carry
>> around the Expr?
>>
>> Thanks!
>>
>> On Friday, August 1, 2014 11:17:50 AM UTC-4, Simon Kornblith wrote:
>>>
>>> Assuming you're generating code that calls fn, as opposed to trying to
>>> call it when generating code in the macro (usually a bad idea), you should
>>> use esc(fn) in place of fn
>>>
>>> On Friday, August 1, 2014 10:50:15 AM UTC-4, Abe Schneider wrote:
>>>>
>>>> I've come across a problem where I have macro to define a grammar
>>>> (similar to how PEGParser currently works):
>>>>
>>>> @grammar foo begin
>>>> rule[fn] = "some" + ("rule" | "test")
>>>> end
>>>>
>>>> where the `[fn]` next to the rule defines a function to call on the
>>>> results (in this case it's an expansion). The issue is that parsing the
>>>> Expr tree, `fn` is given as a Symbol (which makes sense).
>>>>
>>>> However, if I try to turn `fn` into a function I run into the namespace
>>>> issue I've had previously. If `fn` is defined in my module, it works
>>>> without problem. If it's defined in the code that imports the module, it
>>>> will not work because that function doesn't exist in the namespace of the
>>>> module.
>>>>
>>>> I'm guessing there isn't an easy solution to fix this problem, but I
>>>> thought I'd check to see if someone had an idea.
>>>>
>>>> Thanks!
>>>>
>>>>