[Python-Dev] Re: switch statement

Samuele Pedroni pedronis at strakt.com
Thu Apr 21 16:02:38 CEST 2005

Michael Hudson wrote:

>Shannon -jj Behrens <jjinux at gmail.com> writes:
>>On 4/20/05, M.-A. Lemburg <mal at egenix.com> wrote:
>>>My use case for switch is that of a parser switching on tokens.
>>>mxTextTools applications would greatly benefit from being able
>>>to branch on tokens quickly. Currently, there's only callbacks,
>>>dict-to-method branching or long if-elif-elif-...-elif-else.
>>I think "match" from Ocaml would be a much nicer addition to Python
>>than "switch" from C.
>Can you post a quick summary of how you think this would work?
Well, Python lists are used more imperatively and are not made up with 
cons cells,
we have dictionaries which because of ordering issues are not trivial to 
 and  no general ordered records with labels. We have objects and not 
data types. Literature on the topic usually indicates the visitor 
pattern as the
moral equivalent of pattern matching in an OO-context vs. algebraic data 
one. I agree with that point of view and Python has idioms for the 
visitor pattern.

Interestingly even in the context of objects one can leverage the 
infrastructure that is
there for generalized copying/pickling to allow generalized pattern 
matching of
nested object data structures. Whether it is practical I don't know.

 >>> class Pt:
...   def __init__(self, x,y):
...     self.x = x
...     self.y = y
 >>> p(lambda _: Pt(1, _()) ).match(Pt(1,3))
 >>> p(lambda _: Pt(1, Pt(_(),_()))).match(Pt(1,Pt(Pt(5,6),3)))
(<__main__.Pt instance at 0x40200b4c>, 3)

http://codespeak.net/svn/user/pedronis/match.py is an experiment in that 
direction (preceding this discussion
and inspired while reading a book that was using OCaml for its examples).

Notice that this is quite grossly subclassing pickling infrastracture  
(the innocent bystander should probably not try that), a cleaner 
approach redoing that logic with matching in mind is possible and would 
be preferable.

More information about the Python-Dev mailing list