One concrete example:

I want to reuse the @testset macro in base/test.jl but change the two 
utility functions it calls out to (testset_beginend, testset_forloop) to 
have a richer interface to the AbstractTestSet values used during testing.

But the question is a general one and I tried to simplify the code to the 
essentials. The macro m1 might be very large and complex and I do not want 
to rewrite it or copy-paste it in another module but simply want to 
re-implement some of its utility functions etc.

Hope this helps clarify,

Robert

Den lördag 6 februari 2016 kl. 16:37:54 UTC+1 skrev Cedric St-Jean:
>
> Could you give some context and a more concrete description of what you're 
> trying to do?
>
>  macro m1(ex)
>    @show(ex)
>    @show f1(ex)
>  end
>  function f1(ex)
>    "M1.f1: $ex"
>  end
>
> Do you want the macro m1 to expand into code that calls `M2.f1`? Or do you 
> literally want the code in `m1` to call `M2.f1`, as in the example you 
> gave? That would be an unusual request, but it could be done with multiple 
> dispatch...
>
> On Saturday, February 6, 2016 at 6:39:49 AM UTC-5, Robert Feldt wrote:
>>
>> My feeling is that am missing something very basic here or that this has 
>> been asked/misunderstood many times before. ;) But since I could find an 
>> answer in my searches here goes:
>>
>> How can I reuse some parts of another module while re-implementing some 
>> of it's lower-level functions (it uses internally)? In the example code 
>> below I want to create a new module M2 which reuses (via import and then 
>> export) a macro from another module M1 but re-implements a lower level f1 
>> function that is used in the implementation of m1.
>>
>> module M1
>>   export @m1
>>   macro m1(ex)
>>     @show(ex)
>>     @show f1(ex)
>>   end
>>   function f1(ex)
>>     "M1.f1: $ex"
>>   end
>> end
>>
>> a = 1
>> M1.@m1 a + 1   # prints: f1(ex) = "M1.f1: a + 1"
>>
>> # I want to reuse @m1 but redefine the f1 it uses.
>> module M2
>>   import M1: @m1
>>   function f1(ex)
>>     "M2.f1: $ex"
>>   end
>> end
>>
>> M2.@m1 a + 1 # Not what I want, it still uses M1.f1
>>
>> module M3
>>   import M1: @m1, f1
>>   function f1(ex)
>>     "M3.f1: $ex"
>>   end
>> end
>>
>> M3.@m1 a + 1 # What I want but gives warning that f1 in module M1 
>> overwritten
>> M1.@m1 a + 1 # and M1.@m1 is affected which can affect others...
>>
>> Is there a way I can import @m1 from M1 into my new module but force it 
>> to call my newly defined f1?
>> Am I totally on the wrong track here and another "design" is better?
>>
>> I'd rather not fall back to copy-paste solutions here...
>>
>> Thanks, Robert
>>
>>

Reply via email to