In languages like Julia and Clojure, you can use multimethods to gain the flexibility required to solve the problem. However, the magic sauce is open methods, not multiple dispatch. A key part of any solution is retroactively implementing interfaces.
It should be noted that Clojure’s protocols are much better for handling the expression problem. (cf Stack Overflow answer) Clojure’s dynamism still doesn’t enforce static type checking, of course.
It should be noted that Clojure’s protocols are much better for handling the expression problem. (cf Stack Overflow answer) Clojure’s dynamism still doesn’t enforce static type checking, of course.