I tried a second approach where instead of keeping a function around I keep 
just the symbol. I have a `transform` function that applies the function to 
the resulting values. However, this only moves the problem to a new place. 
In my `transform` method I have:

eval(Expr(:call, action, values))


where `action` is the symbol that I am now carrying around. The `eval` 
still works in the module's namespace, so I get the same error.

If Julia had a way to access the namespace from the calling function, this 
could be made to work. Or for that matter, if I could get the calling 
namespace from the macro, I could then just get the macro that way.

I'm guessing Julia doesn't currently have this functionality, but would it 
be something possible to add?

On Friday, August 1, 2014 12:22:46 PM UTC-4, Abe Schneider wrote:
>
> 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!
>>>>>
>>>>>

Reply via email to