The Science of Programming/SwayPresentations/Objects/Examples5

Here's a switch using typical Sway syntax:

   var x = 0;
   
   switch (x)
       {
       case(3) { println("greater"); }
       case(2) { println("equal"); }
       else    { println("less"); }
       }

To implement switch, we start by defining the case function in anticipation of it being filtered.

   function case(operand,$action,$)
       {
       list(operand,$action,$);
       }

Remember, a filter takes each statement in turn, so as we saw with filtering pop, one line functions are the best to filter.

The strategy for switch:

  • create a filter with the switch expression in scope
  • have the filter throw a success exception
  • attach the filter to case
  • run the body of the switch, looking for success
   function switch(expr,$actions)
       {
       var result;
       function caseFilter(spec)
           {
           var val;
           if (expr == spec[0])
               {
               throw(:success,force(spec[1]));
               }
           else if (spec[2] != :null)
               {
               throw(:success,force(spec[2][0]));
               }
           }
       case . filter = caseFilter;
       result = catch(force($actions));
       if (error?(result))
           {
           if(result . type == :success,result . value,throw(result));
           }
       else
           {
           :null;
           }
       }

Next Previous Top