[Oberon] CASE without ELSE

Jörg Straube joerg.straube at iaeth.ch
Thu Feb 15 22:26:34 CET 2018


Based on Chris‘ example you could write

CASE String.Pos(ch, "ILTQX", 0) OF
-1: (* else case *)
| 0: (* inspect *)
| 1: (* load *)
| 2: (* transfer *)
| 3: (* quit *)
| 4:
END

Jörg

Am 15.02.2018 um 21:51 schrieb Chris Burrows <chris at cfbsoftware.com>:

>> -----Original Message-----
>> From: Oberon [mailto:oberon-bounces at lists.inf.ethz.ch] On Behalf Of
>> Josef Templ
>> Sent: Friday, 16 February 2018 12:58 AM
>> To: oberon at lists.inf.ethz.ch
>> Subject: [Oberon] CASE without ELSE
>> 
>> Hi everybody,
>> 
>> recently I noticed that there is no ELSE clause in the CASE statement
>> of the latest Oberon language version.
>> Has this been removed intentionally or accidentally? Or is there
>> something new instead of it?
>> 
> 
> As far as I know it was removed intentionally. The original programmer has to explicitly handle all cases. This helps a subsequent maintainer of the software to understand the programmers intentions. He does not have to try and guess whether an overlooked case was accidental or not.
> 
>> If it has been removed intentionally:
>> Is there a significant simplification in the compiler or a speedup at
>> runtime?
>> 
> 
> Not if the CASE statement is efficiently implemented as a jump table (for runtime speed) - assuming the compiler traps missing cases as runtime errors.
> 
>> On the other side, it puts some burden onto the programmer to work
>> around it.
>> As an example: I tried to implement a simple command interpreter that
>> reads a character
>> from a serial line (connected to a keyboard) and executes a related
>> procedure in an embedded target.
>> The natural language construct, I thought, would be a CASE for that
>> kind of problem.
>> Pressing an invalid key could be ignored easily by the ELSE clause of
>> the CASE.
>> 
> 
> Suppose you had 5 commands "I", "L", "T", "Q", and "X". In the Astrobe RISC and Cortex-M Oberon compilers on of the simplest (but not the most elegant or efficient) way to do this would be something like 
> 
> (*untested*)
> IF String.Pos(ch, "ILTQX", 0) < 0 THEN
>  (* Process error *)
> ELSE
>  CASE ch OF
>   "L": ....
> 
> 
> Ideally you would map your command characters to symbolic constants at the earliest opportunity and then use those in your logic. Something like this:
> 
> CONST
>  Inspect = 0;
>  Load = 1;
>  Transfer = 2;
>  Exit = 3;
>  Invalid = 4;
> 
> VAR
>  Command: INTEGER;
> 
> PROCEDURE ToCommand(ch: CHAR): INTEGER;
> (* Use an array map or a hash table to map your characters to command values *)
> ...
> ...
> 
> 
> CASE command OF
>  Inspect: ... |
>  ....
>  Invalid: (* Process error *)
> END;
> 
> Regards,
> Chris Burrows
> CFB Software
> http://www.astrobe.com/RISC5
> 
> 
> 
> --
> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
> https://lists.inf.ethz.ch/mailman/listinfo/oberon



More information about the Oberon mailing list