The Pico Printer

(contents of the file Print.pco)
general info

{ print(Exp):
    { indent: 0;
       
      print_expression(Exp):
        void;

      print_list(Lst, Ini, Sep, Trm):
        { display(Ini);
          if(size(Lst) > 0,
             { print(Lst[1]);
               for(k: 2, k:= k+1, not(k > size(Lst)),
                   { display(Sep); 
                     print_expression(Lst[k]) }) },
             void);
          display(Trm) };

      print_number(Exp):
        { val: Exp[NBR_VAL_idx];
          display(val) };

      print_fraction(Exp):
        { val: Exp[FRC_VAL_idx];
          display(val) };

      print_text(Exp):
        { val: Exp[TXT_VAL_idx];
          display(val) };

      print_table(Exp):
        { tab: Exp[TAB_TAB_idx];
          print_list(tab, '[', ',', ']') };

      print_function(Exp):
        { nam: Exp[FUN_NAM_idx];
          display('') };

      print_native(Exp):
        { nam: Exp[NAT_Nam_idx];
          display('') };

      print_void(Exp):
        display('');
      
      print_variable(Exp): 
        { nam: Exp[VAR_NAM_idx];
          display(nam) };
            
      print_application(Exp): 
        { nam: Exp[APL_NAM_idx];
          arg: Exp[APL_ARG_idx];
          display(nam);
          if(arg[TAG_idx] = TAB_tag,
             { tab: arg[TAB_TAB_idx];
               print_list(tab, '(', ',', ')') },
             { display('@');
               print_expression(arg) })};
            
      print_tabulation(Exp): 
        { nam: Exp[TBL_NAM_idx];
          idx: Exp[TBL_IDX_idx];
          display(nam, '[');
          print_expression(idx);
          display(']') };
            
      print_definition(Exp): 
        { inv: Exp[DEF_INV_idx];
          exp: Exp[DEF_EXP_idx];
          print_expression(inv);
          display(': ');
          print_expression(exp) };
            
      print_assignment(Exp): 
        { inv: Exp[SET_INV_idx];
          exp: Exp[SET_EXP_idx];
          print_expression(inv);
          display(':= ');
          print_expression(exp) };
            
      print_dictionary(Exp): 
        display('');
            
      exp_case: case(NBR_tag => print_number,
                     FRC_tag => print_fraction,
                     TXT_tag => print_text,
                     TAB_tag => print_table,
                     FUN_tag => print_function,
                     NAT_tag => print_native,
                     VAR_tag => print_variable,
                     APL_tag => print_application,
                     TBL_tag => print_tabulation,
                     DEF_tag => print_definition,
                     SET_tag => print_assignment,
                     DCT_tag => print_dictionary,
                     VOI_tag => print_void);
      
      print_expression(Exp):=
        { cas: exp_case(Exp[TAG_idx]);
          cas(Exp) };
      
      print(Exp):=
        { indent:= 0;
          print_expression(Exp) };
      
      print(Exp) };

  display('printer installed', eoln)}

Back to the metacircular evaluator

This page was made (with lots of hard work!) by Wolfgang De Meuter