[Oberon] CASE without ELSE

Jörg joerg.straube at iaeth.ch
Sat Feb 17 23:52:36 CET 2018

The difference between IF and CASE is, that in the CASE the type of the expression is changed to the type extension. Very handy for message handlers. See below

  Ext = RECORD (Base) i: INTEGER END;
  Ext2 = RECORD (Base) c: CHAR END;

PROCEDURE CaseExample(VAR b: Base);
    CASE b OF
    Ext:      b.i := 0
    | Ext2: b.c := „A“
    (* this is equivalent *)
    IF b IS Ext THEN b(Ext).i := 0
    ELSIF b is Ext2 THEN b(Ext2).c := „A“
  END CaseExample;


> Am 17.02.2018 um 23:32 schrieb Arthur Yefimov <artur.efimov at gmail.com>:
> Andreas wrote:​
> ​> ​One just needs to get the order right: extended types first, base type last (if one placed the base type at the beginning of the list, it would always evaluate to TRUE even if M were an extension of T)
> ​Does it mean that CASE statement for pointer/record types work like an IF statement? Does it sequentially check all options one by one until it hits the right one? In this case, what does "CASE" give in comparison to using "IS" clause,​ i.e. "IF obj IS MyViewer THEN ... ELSIF obj IS ..."?
> --
> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
> https://lists.inf.ethz.ch/mailman/listinfo/oberon
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.inf.ethz.ch/pipermail/oberon/attachments/20180217/8007b277/attachment.html>

More information about the Oberon mailing list