On Sat, 15 Jan 2022, Ryan Joseph via fpc-pascal wrote:



On Jan 15, 2022, at 8:30 AM, Michael Van Canneyt via fpc-pascal 
<fpc-pascal@lists.freepascal.org> wrote:

I saw a new syntax in Swift which I thought was clever and fits a pattern
I've seen before.  Basically it's a case statement for class types which
lets you branch depending on which class type the class instance is at run
time.

I think Scala did it before Swift.

What did it look like? Seems like an obvious feature any OOP language should 
have.

myInstance match {
  case TComponent => dosomething;
  case TPersistent => dosomethingelse;
}

Swift has a compound switch statement which does lots of things. It's a little messy but it accomplishes this 
well. For example here they have a "case is" and "case let _ as" which tests for class 
type or casts to a local variable using "as".

          switch object {
               case is Message:
                  break
               case let content as MessageContent:
                  break
               case let attachment as Attachment:
                  break
               default: break
             }

Problem for Pascal is how to handle the casting mess. C languages (and Delphi 
now I guess) can do inline variable declarations to avoid the casting.

I don't see how an inline variable helps with the casting mess. You'll
always need a cast.

What I do is Var
  MyInstance : TObject;
  MyNeededClass : TMyNeededClass absolute myInstance:

 >
Come to think of it this a similar problem with for-loops where you want to 
loop over a collection of only certain types. For example:

for monster in monsters do
   if monster is TZenChan then
     TZenChan(monster).Dothis;

See above for the solution.

Michael.
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to