SelectCase
Julian Fitzell
julian at beta4.com
Wed Jan 4 19:55:36 UTC 2006
Or, using registered objects for each key handler, something like:
(self keyHandlers detect: [:ea | ea wantsKey: keyPressed] ifNone: [])
ifNotNilDo: [:handler | handler handleKey: keyPressed]
Or you could use a #select: if you want all the handlers to have a
chance to act.
Ramon Leon wrote:
> How about...
>
> (Dictionary new)
> at: $c put: [self copy];
> at: $x put: [self cut];
> at: $v put: [self paste];
> at: keyPressed ifAbsent:[].
>
>
>>-----Original Message-----
>>From: squeak-dev-bounces at lists.squeakfoundation.org
>>[mailto:squeak-dev-bounces at lists.squeakfoundation.org] On
>>Behalf Of Chris Muller
>>Sent: Wednesday, January 04, 2006 12:29 PM
>>To: squeak-dev at lists.squeakfoundation.org
>>Subject: Re: SelectCase
>>
>>I agree with your sentiments, but then I came across one case
>>(after ten years!) where, to my shock-and-awe (tm), case
>>seemed appropriate. I'm interested in what you think a good
>>alternative might be that also pays for its weight..
>>
>>A key-command handler method.
>>
>> keyPressed caseOf:
>> {[$c]->[self copy].
>> [$x]->[self cut].
>> [$v]->[self paste]}
>>
>>What's the best way other than case statement to map
>>keyPressed to the desired action?
>>
>>Regards..
>>
>>
>>>Message: 24
>>>Date: Wed, 04 Jan 2006 03:38:39 -0800
>>>From: Andreas Raab <andreas.raab at gmx.de>
>>>Subject: Re: SelectCase
>>>To: The general-purpose Squeak developers list
>>> <squeak-dev at lists.squeakfoundation.org>
>>>Message-ID: <43BBB3BF.70801 at gmx.de>
>>>Content-Type: text/plain; charset=ISO-8859-1; format=flowed
>>>
>>>Ragnar Hojland Espinosa wrote:
>>>
>>>>>I know select/case statements is not desired in
>>>
>>>the squeak community
>>>
>>>>>and I understand why (it's often a wrong
>>>
>>>modelisation). But I put
>>>
>>>>>an implementation in squeaksource which can be
>>>
>>>used like this :
>>>
>>>>>(aString selectCase )
>>>>> testBlock: [:ref :case | case match: ref];
>>>>> case: 't*' exec: [self assert: false];
>>>>> case: 'v*' exec: [self assert: true];
>>>>> case: 'value' exec: [self assert: false];
>>>>> default: [^ nil]
>>>>>
>>>>>#testBlock: and #default: can be ommited.
>>>>
>>>>What's wrong with
>>>>
>>>
>>http://wiki.cs.uiuc.edu/CampSmalltalk/Smalltalk+case-statement
>>
>>>?
>>>
>>>Nothing. I think it sucks just about as much as the above
>>
>>;-) And, oh,
>>
>>>did you know that Squeak has had a case statement for ages?
>>
>>I've never
>>
>>>seen it used in any code but, in theory, it works like this:
>>>
>>> aString caseOf: {
>>> ['foo'] -> [self foo].
>>> ['bar'] -> [self bar].
>>> } otherwise:[self frobler].
>>>
>>>And there is nothing wrong with this either, and yes, it
>>
>>sucks just as
>>
>>>much as the other variants ;-) And just in case you haven't guessed
>>>it:
>>>"Classic" case statements (those based purely on
>>>equality) can *always*
>>>be represented by a simple dictionary lookup, e.g, instead of the
>>>above you might as well write:
>>>
>>> map := Dictionary new.
>>> map at: 'foo' put: [self foo].
>>> map at: 'bar' put: [self bar].
>>> elseBlock := [self mumble].
>>> result := (map at: aString ifAbsent:[elseBlock]) value.
>>>
>>>and if you don't like that, stick the map into a class var
>>
>>and replace
>>
>>>it with something roughly equivalent to:
>>>
>>> ^(SwitchMap at: aString ifAbsent:[whatever]) value.
>>>
>>>In any case, I doubt the existence of YACI (yet another case
>>>implementation) will change much. It's bad style to begin with and
>>>it's easy enough (actually trivial) to simulate by using
>>
>>objects. The
>>
>>>one case implementation I'd really like is one that
>>
>>actually *reads*
>>
>>>well (e.g., one that doesn't look like reverse polish
>>>notation) but for
>>>obvious reasons that would require quite a bit of compiler support.
>>>
>>>Cheers,
>>> - Andreas
>>
>>
>>
>
More information about the Squeak-dev
mailing list
|