Clojure Protocols & expression problem
retard
re at tard.com.invalid
Wed Apr 28 16:28:11 PDT 2010
Wed, 28 Apr 2010 13:22:53 -0400, bearophile wrote:
> BCS:
>
>>Could you elaborate on what exactly the expression problem is?<
>
> I am far from being an expert on such matters, I will do what I can to
> answer. It's not an esoteric problem, if you program with an OO language
> you have probably faced it sometime.
You failed to mention that the OOP solution is in many cases overly
complex. When you don't need to subclass the car elements, a functional
pattern matching happens to win - at least if the declarativeness of code
matters. The implementation can also use jump tables so it becomes faster
than double dispatch. Luckily D is never going to get algebraic data
types so you can all stop reading this post right here.
data CarElement = Wheel Name
| Engine
| Body
| Car [CarElement]
defaultCar = Car [ Wheel "front left"
, Wheel "front right"
, Wheel "back left"
, Wheel "back right"
, Body
, Engine
]
makeVisitor f element = map f (case element of
Car elements = element : elements
_ = [element]
)
visitor element = case element of
Wheel name = "Visiting " +++ name +++ " wheel"
Engine = "Visiting engine"
Body = "Visiting body"
Car _ = "Visiting car"
doVisitor element = case element of
Wheel name = "Kicking my " +++ name +++ " wheel"
Engine = "Starting my engine"
Body = "Moving my body"
Car _ = "Starting my car"
-- an example of usage:
-- makeVisitor visitor default
-- makeVisitor doVisitor default
More information about the Digitalmars-d
mailing list