Lots to think about :)

I definitely agree there needs to be a simple way to "query" a predicate
dispatch system in order for it to work well in larger programs. But I
haven't thought about it much more then that yet.

David

On Mon, Feb 20, 2012 at 9:56 PM, kovas boguta <kovas.bog...@gmail.com>wrote:

> Mathematica implements a version of open and order-independent
> dispatch, so I wanted to add some points to the discussion.
>
> The design of Mathematica's pattern matching is tightly coupled to the
> language's computational model, as well as with all other aspects of
> the system. So a lot of it would get lost in translation to Clojure,
> and not give you as much mileage as it does in Mathematica.  So I'm
> mostly gonna focus on some pitfalls rather than the upside.
>
> The biggest problem for the developer is understanding the state of
> the rules system, especially during interactive development.
>
> Mathematica tries it's best to insert new function definitions in the
> "right" order, trying to figure out if pattern X if a subcase of
> pattern Y, etc. Of course, there are ambiguous cases, particular since
> the pattern language is rich. You solve this problem by either making
> your pattern more specific, changing the order in which definitions
> are loaded, or attaching the definition another symbol that has higher
> precedence.
>
> So debugging the pattern ordering is something you end up needing to
> know how to do.
>
> But this exposes a bigger problem: when doing interactive development,
> you will end up with old definitions sticking around. You are
> debugging one case of your function, and change the pattern a little.
> The old pattern is still there, potentially shadowing the new one. So
> anytime you see unexpected output while debugging, you need to wonder
> about the state of the definitions and if you should reinitialize
> them.
>
> You can also get a function that works at the repl, but its broken in
> source. The way this happens is, you enter definitions in arbitrary
> order at the repl, but they are in a different order in source. So in
> cases where order matters, this can get you too.
>
> I've pretty much had every possible situation happen.
>
> In Mathematica, it's possible to manually specific the order of the
> definitions, but it's too cumbersome to use in source code.
>
> In Clojure, the situation is simpler, and that helps. The pattern
> language (or versions that we've seen of it) is simpler, and
> destructuring is not part of its mission. (Changes to destructuring
> are a common source of this shadowing issue.) There is also the
> core.logic engine to do more deduction about the patterns themselves.
>
> Still, I still see the two problems of 1. debugging the ordering, and
> then 2. dealing with the state of the definitions during debugging and
> interactive development.
>
> On 1, the best thing is if you look at the source and immediately
> understand what the ordering will be. So when you are writing code,
> you just have this simple mental model, and spotting mistakes is easy.
> For example, if the system does no "intelligent" ordering for you, its
> obvious what the order at runtime will be, and you don't have to fight
> anything to get things into the desired order.
>
> On 2, this is more tooling support, in rough order of importance
> -- which case is called for input X, and why
> -- debugging a specific case independent of all others (suppress the
> other cases)
> -- various operations for comparing and testing patterns
> -- ide support for displaying / editing the ordering of definitions
>
> I've spent a ton of time debugging this stuff; its really important to
> have a quick way to find out why something happened in these open
> matching systems, and then have a convient way to patch the behavior.
> Its just not as easy as changing a cond case in a single place in
> source.
>
> The great thing about pattern matching in Mathematica is that it is so
> deeply integrated with all kinds of other primitives, from string
> manipulation, data manipulation, math stuff, the equivalent of Map,
> the equivalent of macros.  So my question is can clojure-style pattern
> matching and predicate dispatch be equally as powerful and pervasive,
> but it it's own way.
>
> One thought I had is about the relationship with program querying.
> With predicate dispatch, you'll have greater runtime control over your
> program, can swap things in and out at a finer granularity. And with
> this idea of program querying that Rich talked about, you might find
> all sorts of behaviors in your program that you might want to do
> something about. Seems sort of complementary.
>
> Maybe there is something there at that intersection, that can be a
> greater extension of logic-based programming beyond only extending the
> multimethod concept. So instead of replacing defn or defmulti, there
> could be an entirely different use case, and it would be obvious which
> one to use when.
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to