summaryrefslogtreecommitdiff
path: root/ADTs/adts.b
diff options
context:
space:
mode:
authorseh <henesy.dev@gmail.com>2019-03-18 02:44:37 -0500
committerseh <henesy.dev@gmail.com>2019-03-18 02:44:37 -0500
commit1dbebd5fe59f27106a4dfa553c9ee8b893d6008e (patch)
treef0a5f4e479f19881d48fecc8f03b85cd98ce4ca8 /ADTs/adts.b
parenta609ffb20226eba3d4dc628d7b4d284eddd1c114 (diff)
add ADT example
Diffstat (limited to 'ADTs/adts.b')
-rw-r--r--ADTs/adts.b52
1 files changed, 52 insertions, 0 deletions
diff --git a/ADTs/adts.b b/ADTs/adts.b
new file mode 100644
index 0000000..d5ff7e1
--- /dev/null
+++ b/ADTs/adts.b
@@ -0,0 +1,52 @@
+implement ADTs;
+
+include "sys.m";
+include "draw.m";
+
+sys: Sys;
+print: import sys;
+
+ADTs: module {
+ init: fn(nil: ref Draw->Context, nil: list of string);
+
+ Person: adt {
+ age: int;
+ name: string;
+ stringify: fn(p: self ref Person): string;
+ };
+};
+
+Town: adt {
+ pop: array of ref Person;
+ name: string;
+ stringify: fn(t: self ref Town): string;
+};
+
+init(nil: ref Draw->Context, nil: list of string) {
+ sys = load Sys Sys->PATH;
+
+ p := ref Person(27, "Spike");
+ print("%s\n", p.name);
+
+ t: Town;
+ t.pop = array[] of {p, ref Person(13, "Ed")};
+ t.name = "Mars";
+
+ town := ref t;
+ print("%s\n", town.stringify());
+
+ exit;
+}
+
+Person.stringify(p: self ref Person): string {
+ return p.name;
+}
+
+Town.stringify(t: self ref Town): string {
+ s := "Name: " + t.name + "\nSize: " + string len t.pop + "\nMembers:";
+
+ for(i := 0; i < len t.pop; i++)
+ s += "\n→ " + t.pop[i].stringify();
+
+ return s;
+}