ref: babf901b4a508c3ec5d1f89655f10377bbdf9637
dir: /module/alphabet.m/
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;
};
};