I'd vote for toivo's suggestion. 
So this could be a design:

immutable Parser{Policy}
common
fields
end

#construction
parser = Parser{:policy1}(...)
#specialize the functions to a policy:
validmove(::Parser{:policy1}) = ...
validmove(::Parser{:policy2}) = ...
#define functions for all parsers
move!(::Parser) = ...


Am Freitag, 27. März 2015 05:39:36 UTC+1 schrieb Deniz Yuret:
>
> I've been wrecking my brain to figure out the best way to do this in 
> Julia.  We have a set of objects (parsers in my case), with common state 
> elements and constructor (buffer, stack, a set of arcs etc.), but different 
> move sets (arceager, archybrid etc. see this 
> <http://anthology.aclweb.org/Q/Q13/Q13-1033.pdf> if interested).  Thus 
> functions like validmoves(), move!() etc. are of several different types. 
>  So far I have considered:
>
> 1. Just define multiple composite types with different move() methods 
> (pro), listing the same fields and constructor for each (con).
>
> 2. Define a single "state" type that has the necessary fields and 
> constructor (pro), include a "state" as a field in multiple composite types 
> requiring double reference (con: i.e. you need to type parser.state.field 
> instead of just parser.field).
>
> 3. Put the list of (common) fields in a file and include this file in the 
> definition of each composite type.  This prevents the problem of repeating 
> the same code, but makes me a bit uneasy.  It also does not solve the 
> constructor problem (I guess I can put the body of the constructors in a 
> common file and include it, but that makes me even more uneasy).
>
> 4. Have a single composite type with a field that indicates the "move 
> policy".  Then have functions like validmoves(), move!() etc. branch on 
> this move policy.  But that's just throwing away the beautiful function 
> overloading machinery of Julia.
>
> Is there a "Julia" way that I am missing?  Which strategy would you choose?
>
> best,
> deniz
>
>

Reply via email to