Alphabet: module { PATH: con "/dis/alphabet/alphabet.dis"; ONDEMAND, CHECK: con 1<<iota; init: fn(); copy: fn(): Alphabet; quit: fn(); loadtypeset: fn(qname: string, c: chan of ref Proxy->Typescmd[ref Value], errorc: chan of string): string; declare: fn(qname: string, sig: string, flags: int): string; undeclare: fn(name: string): string; importmodule: fn(qname: string): string; importtype: fn(qname: string): string; importvalue: fn(v: ref Value, qname: string): (ref Value, string); autoconvert: fn(src, dst: string, transform: ref Sh->Cmd, errorc: chan of string): string; define: fn(name: string, expr: ref Sh->Cmd, errorc: chan of string): string; setautodeclare: fn(on: int); Decltypeset: adt { name: string; alphabet: string; types: array of string; mods: array of (string, string); }; Declarations: adt { typesets: array of Decltypeset; defs: array of (string, string); };# getdecls: fn(): ref Declarations;# getexprdecls: fn(e: ref Sh->Cmd): ref Declarations;# declcompat: fn(d0, d1: ref Declarations): int; getmodule: fn(name: string): (string, string, ref Sh->Cmd); gettypesets: fn(): list of string; getmodules: fn(): list of string; gettypesetmodules: fn(tsname: string): chan of string; gettypes: fn(typeset: string): list of string; getautoconversions: fn(): list of (string, string, ref Sh->Cmd); typecompat: fn(t0, t1: string): (int, string); show: fn(); mkqname: fn(typeset, name: string): string; canon: fn(qname: string): string; splitqname: fn(qname: string): (string, string); parse: fn(expr: string): (ref Sh->Cmd, string); eval: fn(expr: ref Sh->Cmd, drawctxt: ref Draw->Context, args: list of ref Value): string; eval0: fn(expr: ref Sh->Cmd, dsttype: string, drawctxt: ref Draw->Context, report: ref Reports->Report, errorc: chan of string, args: list of ref Value, vc: chan of ref Value); rewrite: fn(expr: ref Sh->Cmd, dsttype: string, errorc: chan of string): (ref Sh->Cmd, string); Value: adt { free: fn(v: self ref Value, used: int); dup: fn(v: self ref Value): ref Value; gets: fn(v: self ref Value): string; isstring: fn(v: self ref Value): int; type2s: fn(tc: int): string; typec: fn(v: self ref Value): int; typename: fn(v: self ref Value): string; c: fn(v: self ref Value): ref Value.Vc; s: fn(v: self ref Value): ref Value.Vs; r: fn(v: self ref Value): ref Value.Vr; f: fn(v: self ref Value): ref Value.Vf; w: fn(v: self ref Value): ref Value.Vw; d: fn(v: self ref Value): ref Value.Vd; z: fn(v: self ref Value): ref Value.Vz; pick{ Vc => i: ref Sh->Cmd; Vs => i: string; Vr => i: chan of string; Vf or Vw => i: chan of ref Sys->FD; Vd => i: Datachan; Vz => i: Proxyval; # a proxy for the actual value, held by another process } }; Proxyval: adt { typec: int; id: int; }; Datachan: adt { d: chan of array of byte; stop: chan of int; };}; Mainmodule: module { typesig: fn(): string; init: fn(); quit: fn(); run: fn(ctxt: ref Draw->Context, r: ref Reports->Report, errorc: chan of string, opts: list of (int, list of ref Alphabet->Value), args: list of ref Alphabet->Value): ref Alphabet->Value;}; # evaluate an expressionEval: module { PATH: con "/dis/alphabet/eval.dis"; init: fn(); Context: adt[V, M, Ectxt] for { V => dup: fn(t: self V): V; free: fn(v: self V, used: int); isstring: fn(v: self V): int; gets: fn(t: self V): string; type2s: fn(tc: int): string; typec: fn(t: self V): int; M => find: fn(c: Ectxt, s: string): (M, string); typesig: fn(m: self M): string; run: fn(m: self M, c: Ectxt, errorc: chan of string, opts: list of (int, list of V), args: list of V): V; mks: fn(c: Ectxt, s: string): V; mkc: fn(c: Ectxt, cmd: ref Sh->Cmd): V; typename2c: fn(s: string): int; cvt: fn(c: Ectxt, v: V, tc: int, errorc: chan of string): V; } { eval: fn( expr: ref Sh->Cmd, ctxt: Ectxt, errorc: chan of string, args: list of V ): V; }; cmdusage: fn[V](nil: V, sig: string): string for { V => type2s: fn(tc: int): string; }; usage2sig: fn[V](nil: V, u: string): (string, string) for{ V => typename2c: fn(s: string): int; }; blocksig: fn[M, Ectxt](nil: M, ctxt: Ectxt, c: ref Sh->Cmd): (string, string) for{ M => typename2c: fn(s: string): int; find: fn(c: Ectxt, s: string): (M, string); typesig: fn(m: self M): string; }; typecompat: fn(t0, t1: string): int; splittype: fn(t: string): (int, string, string);}; Extvalues: module { PATH: con "/dis/alphabet/extvalues.dis"; Values: adt[V] { lock: chan of int; v: array of (int, V); freeids: list of int; new: fn(): ref Values[V]; add: fn(vals: self ref Values, v: V): int; inc: fn(vals: self ref Values, id: int); del: fn(vals: self ref Values, id: int); };}; # generic proxy implementation:Proxy: module { PATH: con "/dis/alphabet/proxy.dis"; # operators on a type system Typescmd: adt[V] { pick { Load => cmd: string; reply: chan of (chan of ref Modulecmd[V], string); Dup => v: V; reply: chan of V; Free => v: V; used: int; reply: chan of int; Alphabet => reply: chan of string; Type2s => tc: int; reply: chan of string; Loadtypes => name: string; reply: chan of (chan of ref Typescmd[V], string); Modules => reply: chan of string; } }; # proxy for a loaded module. Modulecmd: adt[V] { pick { Typesig => reply: chan of string; Run => ctxt: ref Draw->Context; report: ref Reports->Report; errorc: chan of string;# stopc: chan of int; opts: list of (int, list of V); args: list of V; reply: chan of V; } }; proxy: fn[Ctxt,Cvt,M,V,EV](ctxt: Ctxt): ( chan of ref Proxy->Typescmd[EV], chan of (string, chan of ref Proxy->Typescmd[V]) ) for { M => typesig: fn(m: self M): string; run: fn(m: self M, ctxt: ref Draw->Context, r: ref Reports->Report, errorc: chan of string, opts: list of (int, list of V), args: list of V): V; quit: fn(m: self M); Ctxt => loadtypes: fn(ctxt: self Ctxt, name: string): (chan of ref Proxy->Typescmd[V], string); type2s: fn(ctxt: self Ctxt, tc: int): string; alphabet: fn(ctxt: self Ctxt): string; modules: fn(ctxt: self Ctxt, r: chan of string); find: fn(ctxt: self Ctxt, s: string): (M, string); getcvt: fn(ctxt: self Ctxt): Cvt; Cvt => int2ext: fn(cvt: self Cvt, v: V): EV; ext2int: fn(cvt: self Cvt, ev: EV): V; free: fn(cvt: self Cvt, v: EV, used: int); dup: fn(cvt: self Cvt, v: EV): EV; };};
Alphabet: module {
PATH: con "/dis/alphabet/alphabet.dis";
ONDEMAND, CHECK: con 1<<iota;
init: fn();
copy: fn(): Alphabet;
quit: fn();
loadtypeset: fn(qname: string, c: chan of ref Proxy->Typescmd[ref Value], errorc: chan of string): string;
declare: fn(qname: string, sig: string, flags: int): string;
undeclare: fn(name: string): string;
importmodule: fn(qname: string): string;
importtype: fn(qname: string): string;
importvalue: fn(v: ref Value, qname: string): (ref Value, string);
autoconvert: fn(src, dst: string, transform: ref Sh->Cmd, errorc: chan of string): string;
define: fn(name: string, expr: ref Sh->Cmd, errorc: chan of string): string;
setautodeclare: fn(on: int);
Decltypeset: adt {
name: string;
alphabet: string;
types: array of string;
mods: array of (string, string);
};
Declarations: adt {
typesets: array of Decltypeset;
defs: array of (string, string);
};
# getdecls: fn(): ref Declarations;
# getexprdecls: fn(e: ref Sh->Cmd): ref Declarations;
# declcompat: fn(d0, d1: ref Declarations): int;
getmodule: fn(name: string): (string, string, ref Sh->Cmd);
gettypesets: fn(): list of string;
getmodules: fn(): list of string;
gettypesetmodules: fn(tsname: string): chan of string;
gettypes: fn(typeset: string): list of string;
getautoconversions: fn(): list of (string, string, ref Sh->Cmd);
typecompat: fn(t0, t1: string): (int, string);
show: fn();
mkqname: fn(typeset, name: string): string;
canon: fn(qname: string): string;
splitqname: fn(qname: string): (string, string);
parse: fn(expr: string): (ref Sh->Cmd, string);
eval: fn(expr: ref Sh->Cmd,
drawctxt: ref Draw->Context,
args: list of ref Value): string;
eval0: fn(expr: ref Sh->Cmd,
dsttype: string,
drawctxt: ref Draw->Context,
report: ref Reports->Report,
errorc: chan of string,
args: list of ref Value,
vc: chan of ref Value);
rewrite: fn(expr: ref Sh->Cmd, dsttype: string,
errorc: chan of string): (ref Sh->Cmd, string);
Value: adt {
free: fn(v: self ref Value, used: int);
dup: fn(v: self ref Value): ref Value;
gets: fn(v: self ref Value): string;
isstring: fn(v: self ref Value): int;
type2s: fn(tc: int): string;
typec: fn(v: self ref Value): int;
typename: fn(v: self ref Value): string;
c: fn(v: self ref Value): ref Value.Vc;
s: fn(v: self ref Value): ref Value.Vs;
r: fn(v: self ref Value): ref Value.Vr;
f: fn(v: self ref Value): ref Value.Vf;
w: fn(v: self ref Value): ref Value.Vw;
d: fn(v: self ref Value): ref Value.Vd;
z: fn(v: self ref Value): ref Value.Vz;
pick{
Vc =>
i: ref Sh->Cmd;
Vs =>
i: string;
Vr =>
i: chan of string;
Vf or
Vw =>
i: chan of ref Sys->FD;
Vd =>
i: Datachan;
Vz =>
i: Proxyval; # a proxy for the actual value, held by another process
}
};
Proxyval: adt {
typec: int;
id: int;
};
Datachan: adt {
d: chan of array of byte;
stop: chan of int;
};
};
Mainmodule: module {
typesig: fn(): string;
init: fn();
quit: fn();
run: fn(ctxt: ref Draw->Context, r: ref Reports->Report, errorc: chan of string,
opts: list of (int, list of ref Alphabet->Value), args: list of ref Alphabet->Value): ref Alphabet->Value;
};
# evaluate an expression
Eval: module {
PATH: con "/dis/alphabet/eval.dis";
init: fn();
Context: adt[V, M, Ectxt]
for {
V =>
dup: fn(t: self V): V;
free: fn(v: self V, used: int);
isstring: fn(v: self V): int;
gets: fn(t: self V): string;
type2s: fn(tc: int): string;
typec: fn(t: self V): int;
M =>
find: fn(c: Ectxt, s: string): (M, string);
typesig: fn(m: self M): string;
run: fn(m: self M, c: Ectxt, errorc: chan of string,
opts: list of (int, list of V), args: list of V): V;
mks: fn(c: Ectxt, s: string): V;
mkc: fn(c: Ectxt, cmd: ref Sh->Cmd): V;
typename2c: fn(s: string): int;
cvt: fn(c: Ectxt, v: V, tc: int, errorc: chan of string): V;
}
{
eval: fn(
expr: ref Sh->Cmd,
ctxt: Ectxt,
errorc: chan of string,
args: list of V
): V;
};
cmdusage: fn[V](nil: V, sig: string): string
for {
V =>
type2s: fn(tc: int): string;
};
usage2sig: fn[V](nil: V, u: string): (string, string)
for{
V =>
typename2c: fn(s: string): int;
};
blocksig: fn[M, Ectxt](nil: M, ctxt: Ectxt, c: ref Sh->Cmd): (string, string)
for{
M =>
typename2c: fn(s: string): int;
find: fn(c: Ectxt, s: string): (M, string);
typesig: fn(m: self M): string;
};
typecompat: fn(t0, t1: string): int;
splittype: fn(t: string): (int, string, string);
};
Extvalues: module {
PATH: con "/dis/alphabet/extvalues.dis";
Values: adt[V] {
lock: chan of int;
v: array of (int, V);
freeids: list of int;
new: fn(): ref Values[V];
add: fn(vals: self ref Values, v: V): int;
inc: fn(vals: self ref Values, id: int);
del: fn(vals: self ref Values, id: int);
};
};
# generic proxy implementation:
Proxy: module {
PATH: con "/dis/alphabet/proxy.dis";
# operators on a type system
Typescmd: adt[V] {
pick {
Load =>
cmd: string;
reply: chan of (chan of ref Modulecmd[V], string);
Dup =>
v: V;
reply: chan of V;
Free =>
v: V;
used: int;
reply: chan of int;
Alphabet =>
reply: chan of string;
Type2s =>
tc: int;
reply: chan of string;
Loadtypes =>
name: string;
reply: chan of (chan of ref Typescmd[V], string);
Modules =>
reply: chan of string;
}
};
# proxy for a loaded module.
Modulecmd: adt[V] {
pick {
Typesig =>
reply: chan of string;
Run =>
ctxt: ref Draw->Context;
report: ref Reports->Report;
errorc: chan of string;
# stopc: chan of int;
opts: list of (int, list of V);
args: list of V;
reply: chan of V;
}
};
proxy: fn[Ctxt,Cvt,M,V,EV](ctxt: Ctxt): (
chan of ref Proxy->Typescmd[EV],
chan of (string, chan of ref Proxy->Typescmd[V])
) for {
M =>
typesig: fn(m: self M): string;
run: fn(m: self M, ctxt: ref Draw->Context, r: ref Reports->Report, errorc: chan of string,
opts: list of (int, list of V), args: list of V): V;
quit: fn(m: self M);
Ctxt =>
loadtypes: fn(ctxt: self Ctxt, name: string): (chan of ref Proxy->Typescmd[V], string);
type2s: fn(ctxt: self Ctxt, tc: int): string;
alphabet: fn(ctxt: self Ctxt): string;
modules: fn(ctxt: self Ctxt, r: chan of string);
find: fn(ctxt: self Ctxt, s: string): (M, string);
getcvt: fn(ctxt: self Ctxt): Cvt;
Cvt =>
int2ext: fn(cvt: self Cvt, v: V): EV;
ext2int: fn(cvt: self Cvt, ev: EV): V;
free: fn(cvt: self Cvt, v: EV, used: int);
dup: fn(cvt: self Cvt, v: EV): EV;
};
};