⚠️ Warning: This is a draft ⚠️

This means it might contain formatting issues, incorrect code, conceptual problems, or other severe issues.

If you want to help to improve and eventually enable this page, please fork RosettaGit's repository and open a merge request on GitHub.

# -*- coding: utf-8 -*- #

##########################################################
# Errata: A collections of OPerators, MODES and variables#
#     that are "kind of" implied by Algol68's definition #
##########################################################

# Standard Diadic OPerator to initialise an object #
PRIO INIT = 1; # should be 0 like assignment #

INT extra = -5; # to remove or display additional decimal places in output #

COMMENT 
  #L# - MODE/type may also be prefixed with SHORT or LONG
  #l# - PROC/variable may also be prefixed with 'short' or 'long'
  #L# - MODE/type may also be prefixed with LONG for unicode
  #l# - PROC/variable may also be prefixed with 'long' for unicode
  #S# - Diadic OPerators concurrently involving LONG and SHORT
  #s# - Diadic+ PROCedure concurrently involving LONG and SHORT
  #LENG# & #SHORTEN# widening operators
END COMMENT

FORMAT 
  #l# bits repr := $g$,
  #l# int repr := $g(-0)$,
  #l# real repr := $g(-#l# real width-extra, #l# real width-2+extra)$,
  #l# compl repr := $f(#l# real repr)"⊥"f(#l# real repr)$,
  #u# string repr := $g$,
  #u# char repr := $g$,
      bool repr := $c("Yes","No")$;

FORMAT 
  fs := $", "$, # insert a field separator #
  #l# real repr fs := $f(#l# real repr)f(fs)$,
  nl := $l$, # insert a new line #
  #l# real item repr := $g"="f(#l# real repr)$, # e.g. "value=1.00000; " #
  #l# int item repr := $g"="f(#l# int repr)$, # e.g. "value=1; " #
  item repr := $g"="g$; # e.g. "value=1; " #

FORMAT hr = $68"-"l$;

MODE SLICE = FLEX[0]STRUCT(INT lwb, upb, by); # for tensor slicing #
FORMAT slice repr = $"["g(-0)":"g(-0)":"g(-0)"]"$;

MODE BOUNDS = FLEX[0]STRUCT(INT lwb, upb); # for tensor slicing #
FORMAT bounds repr = $"["g(-0)":"g(-0)"]"$;
OP LWBUPB = ([]INT x)BOUNDS: STRUCT(INT lwb, upb)(LWB x, UPB x);
OP LWBUPB = ([,]INT x)[]BOUNDS: BOUNDS((LWB x, UPB x),(2 LWB x, 2 UPB x));
OP LWBUPB = ([,,]INT x)[]BOUNDS: BOUNDS((LWB x, UPB x),(2 LWB x, 2 UPB x),(3 LWB x, 3 UPB x));
OP LWBUPB = ([,,,]INT x)[]BOUNDS: BOUNDS((LWB x, UPB x),(2 LWB x, 2 UPB x),(3 LWB x, 3 UPB x),(4 LWB x, 4 UPB x));
OP LWBUPB = ([]REAL x)BOUNDS: STRUCT(INT lwb, upb)(LWB x, UPB x);
OP LWBUPB = ([,]REAL x)[]BOUNDS: BOUNDS((LWB x, UPB x),(2 LWB x, 2 UPB x));
OP LWBUPB = ([,,]REAL x)[]BOUNDS: BOUNDS((LWB x, UPB x),(2 LWB x, 2 UPB x),(3 LWB x, 3 UPB x));
OP LWBUPB = ([,,,]REAL x)[]BOUNDS: BOUNDS((LWB x, UPB x),(2 LWB x, 2 UPB x),(3 LWB x, 3 UPB x),(4 LWB x, 4 UPB x));
# SHORT/LONG COMPL etc #

# Some base routined for generators: #
MODE
  #L#BITSYIELD=  PROC(#L#BITS)VOID,  #L#BITSGEN=  PROC(#L#BITSYIELD)VOID,
  #L#BYTESYIELD= PROC(#L#BYTES)VOID, #L#BYTESGEN= PROC(#L#BYTESYIELD)VOID,
  #L#INTYIELD=   PROC(#L#INT)VOID,   #L#INTGEN=   PROC(#L#INTYIELD)VOID,
  #L#REALYIELD=  PROC(#L#REAL)VOID,  #L#REALGEN=  PROC(#L#REALYIELD)VOID,
  #L#COMPLYIELD= PROC(#L#COMPL)VOID, #L#COMPLGEN= PROC(#L#COMPLYIELD)VOID,
  #L#STRINGYIELD=PROC(#L#STRING)VOID,#L#STRINGGEN=PROC(#L#STRINGYIELD)VOID,
  #U#CHARYIELD=  PROC(#U#CHAR)VOID,  #U#CHARGEN=  PROC(#U#CHARYIELD)VOID,
     BOOLYIELD=  PROC(   BOOL)VOID,     BOOLGEN=  PROC(   BOOLYIELD)VOID;

# Manage optionally uninitialised variables #
MODE
  #L#BITSOPT   = UNION(VOID, #L#BITS),
  #L#BYTESOPT  = UNION(VOID, #L#BYTES),
  #L#INTOPT    = UNION(VOID, #L#INT),
  #L#REALOPT   = UNION(VOID, #L#REAL),
  #L#COMPLOPT  = UNION(VOID, #L#COMPL),
  #L#STRINGOPT = UNION(VOID, #L#STRING),
  #U#CHAROPT   = UNION(VOID, #U#CHAR),
     BOOLOPT   = UNION(VOID,    BOOL);

PRIO ORELSE = 2;
# OPerator to return a "default" value if the OPTion is undefined #
OP
  ORELSE=(#L#BITSOPT   val,#L#BITS   def)BITS:  (val|(#L#BITS   out):out|def),
  ORELSE=(#L#BYTESOPT  val,#L#BYTES  def)BYTES: (val|(#L#BYTES  out):out|def),
  ORELSE=(#L#INTOPT    val,#L#INT    def)INT:   (val|(#L#INT    out):out|def),
  ORELSE=(#L#REALOPT   val,#L#REAL   def)REAL:  (val|(#L#REAL   out):out|def),
  ORELSE=(#L#COMPLOPT  val,#L#COMPL  def)COMPL: (val|(#L#COMPL  out):out|def),
  ORELSE=(#L#STRINGOPT val,#L#STRING def)STRING:(val|(#L#STRING out):out|def),
  ORELSE=(#U#CHAROPT   val,#U#CHAR   def)CHAR:  (val|(#U#CHAR   out):out|def),
  ORELSE=(   BOOLOPT   val,   BOOL   def)BOOL:  (val|(   BOOL   out):out|def);
# SHORT/LONG etc. #

OP
# OPerator to determin is an OPTion is defined #
  HASOPT = (#L#BITSOPT   val)BOOL: ( val | (#L#BITS   out): TRUE | FALSE),
  HASOPT = (#L#BYTESOPT  val)BOOL: ( val | (#L#BYTES  out): TRUE | FALSE),
  HASOPT = (#L#INTOPT    val)BOOL: ( val | (#L#INT    out): TRUE | FALSE),
  HASOPT = (#L#REALOPT   val)BOOL: ( val | (#L#REAL   out): TRUE | FALSE),
  HASOPT = (#L#COMPLOPT  val)BOOL: ( val | (#L#COMPL  out): TRUE | FALSE),
  HASOPT = (#L#STRINGOPT val)BOOL: ( val | (#L#STRING out): TRUE | FALSE),
  HASOPT = (#U#CHAROPT   val)BOOL: ( val | (#U#CHAR   out): TRUE | FALSE),
  HASOPT = (   BOOLOPT   val)BOOL: ( val | (   BOOL   out): TRUE | FALSE);
# SHORT/LONG etc. #

# Note: ℵ indicates attribute is "private", and 
        should not be used outside of this prelude #

MODE  # limited to 4 dimensions #
  REFBITSARRAY =UNION(#L#REF BITS, []#L#REF BITS, [,]#L#REF BITS, [,,]#L#REF BITS, [,,,]#L#REF BITS),
  REFINTARRAY  =UNION(#L#REF INT,  []#L#REF INT,  [,]#L#REF INT,  [,,]#L#REF INT,  [,,,]#L#REF INT),
  REFREALARRAY =UNION(#L#REF REAL, []#L#REF REAL, [,]#L#REF REAL, [,,]#L#REF REAL, [,,,]#L#REF REAL),
  REFCOMPLARRAY=UNION(#L#REF COMPL,[]#L#REF COMPL,[,]#L#REF COMPL,[,,]#L#REF COMPL,[,,,]#L#REF COMPL),
  REFCHARARRAY =UNION(#U#REF CHAR, []#U#REF CHAR, [,]#U#REF CHAR, [,,]#U#REF CHAR, [,,,]#U#REF CHAR),
  REFBOOLARRAY =UNION(   REF BOOL, []   REF BOOL, [,]   REF BOOL, [,,]   REF BOOL, [,,,]   REF BOOL);

# n.b. cannot handle STRUCTs #
MODE #ℵ#SIMPLEIN = UNION(
  REFBITSARRAY,REFINTARRAY,REFREALARRAY,REFCOMPLARRAY,REFCHARARRAY,REFBOOLARRAY
);

MODE  # limited to 4 dimensions #
  BITSARRAY =UNION(#L#BITS, []#L#BITS, [,]#L#BITS, [,,]#L#BITS, [,,,]#L#BITS),
  INTARRAY  =UNION(#L#INT,  []#L#INT,  [,]#L#INT,  [,,]#L#INT,  [,,,]#L#INT),
  REALARRAY =UNION(#L#REAL, []#L#REAL, [,]#L#REAL, [,,]#L#REAL, [,,,]#L#REAL),
  COMPLARRAY=UNION(#L#COMPL,[]#L#COMPL,[,]#L#COMPL,[,,]#L#COMPL,[,,,]#L#COMPL),
  CHARARRAY =UNION(#U#CHAR, []#U#CHAR, [,]#U#CHAR, [,,]#U#CHAR, [,,,]#U#CHAR),
  BOOLARRAY =UNION(   BOOL, []   BOOL, [,]   BOOL, [,,]   BOOL, [,,,]   BOOL);

# n.b. cannot handle STRUCTs #
MODE #ℵ#SIMPLEOUT = UNION(
  BITSARRAY, INTARRAY, REALARRAY, COMPLARRAY, CHARARRAY, BOOLARRAY
);

MODE NEWIO = PROC(REF FILE)VOID;

MODE # limited to 4 dimensions #
  #ℵ#SIMPLEOUTA = [0]SIMPLEOUT,
  #ℵ#SIMPLEOUTB = [0]UNION(SIMPLEOUT, SIMPLEOUTA),
  #ℵ#SIMPLEOUTC = [0]UNION(SIMPLEOUT, SIMPLEOUTA, SIMPLEOUTB),
  OUTMODE       = [0]UNION(SIMPLEOUT, SIMPLEOUTA, SIMPLEOUTB, SIMPLEOUTC, NEWIO),
  OUTMODEF      = [0]UNION(SIMPLEOUT, SIMPLEOUTA, SIMPLEOUTB, SIMPLEOUTC, FORMAT),

  #ℵ#SIMPLEINA = [0]SIMPLEIN,
  #ℵ#SIMPLEINB = [0]UNION(SIMPLEIN, SIMPLEINA),
  #ℵ#SIMPLEINC = [0]UNION(SIMPLEIN, SIMPLEINA, SIMPLEINB),
  INMODE       = [0]UNION(SIMPLEIN, SIMPLEINA, SIMPLEINB, SIMPLEINC, NEWIO),
  INMODEF      = [0]UNION(SIMPLEIN, SIMPLEINA, SIMPLEINB, SIMPLEINC, FORMAT);

COMMENT
PROC sget = (STRING in s, INMODE list)VOID:  raise unimplemented("sget");

PROC sgetf = (STRING in s, INMODEF list)VOID:  (
  FILE file; 
  STRING s := in s; 
  associate(file, s);
  getf(file,list);
  close(file)
);
END COMMENT

PROC type of = (OUTMODEF list)STRING: (
  STRING out := "(";
  STRING sep := "";
  
  FOR i TO UPB list DO
    out +:= sprint(i);
    CASE list[i] IN
      (#L# FORMAT):print("#L#FORMAT"),
CO    (#L# PROC(#L#REF #L#FILE)#L#VOID):print("#L#NEWIO"), CO
      (#L# BITS  v):sprint(("#L#BITS=",v)),
      (#L# INT   v):sprint(("#L#INT=",v)),
      (#L# REAL  v):sprint(("#L#REAL=",v)),
      (#L# COMPL v):sprint(("#L#COMPL=",v)),
      (#U# CHAR  v):sprint(("#U#CHAR=",v)),
      (    BOOL  v):sprint(("BOOL=",v)),
      ([]#L# BITS  v):sprint(("[]#L#BITS=",v)),
      ([]#L# INT   v):sprint(("[]#L#INT=",v)),
      ([]#L# REAL  v):sprint(("[]#L#REAL=",v)),
      ([]#L# COMPL v):sprint(("[]#L#COMPL=",v)),
      ([]#U# CHAR  v):sprint(("[]#U#CHAR=",v)),
      ([]    BOOL  v):sprint(("[]BOOL=",v)),
      ([,]#L# BITS  v):sprint(("[,]#L#BITS=",v)),
      ([,]#L# INT   v):sprint(("[,]#L#INT=",v)),
      ([,]#L# REAL  v):sprint(("[,]#L#REAL=",v)),
      ([,]#L# COMPL v):sprint(("[,]#L#COMPL=",v)),
      ([,]#U# CHAR  v):sprint(("[,]#U#CHAR=",v)),
      ([,]    BOOL  v):sprint(("[,]BOOL=",v)),
      ([,,]#L# BITS  v):sprint(("[,,]#L#BITS=",v)),
      ([,,]#L# INT   v):sprint(("[,,]#L#INT=",v)),
      ([,,]#L# REAL  v):sprint(("[,,]#L#REAL=",v)),
      ([,,]#L# COMPL v):sprint(("[,,]#L#COMPL=",v)),
      ([,,]#U# CHAR  v):sprint(("[,,]#U#CHAR=",v)),
      ([,,]    BOOL  v):sprint(("[,,]BOOL=",v))
CO    (#L# BYTES v):print(("#L#BYTES",[]#L#CHAR(v)))CO
    OUT
      sprint("REF[]STRUCT or SHORT/LONG etc")
    ESAC;
    sep := ","
  OD;
  out+")"
);

PROC sput = (REF STRING out, OUTMODE list)VOID: (
  FILE file; 
  associate(file, out);
  put(file,list);
  close(file);
  out
);

PROC sputf = (REF STRING out, OUTMODEF list)STRING:  (
  FILE file; 
  associate(file, out);
  CASE list[1] IN
    (FORMAT f):putf(file, (list[1], list[2:])) #BF#
  OUT  
    putf(file,list)
  ESAC;
  close(file);
  out
);

PROC sprint = (OUTMODE list)STRING: (
  STRING out;
  sput(out, list);
  out
);

PROC sprintf = (OUTMODEF list)STRING:  (
  STRING out;
  sputf(out, list);
  out
);

SKIP