diff options
| author | seh <henesy.dev@gmail.com> | 2019-03-18 02:44:37 -0500 |
|---|---|---|
| committer | seh <henesy.dev@gmail.com> | 2019-03-18 02:44:37 -0500 |
| commit | 1dbebd5fe59f27106a4dfa553c9ee8b893d6008e (patch) | |
| tree | f0a5f4e479f19881d48fecc8f03b85cd98ce4ca8 /ADTs/adts.b | |
| parent | a609ffb20226eba3d4dc628d7b4d284eddd1c114 (diff) | |
add ADT example
Diffstat (limited to 'ADTs/adts.b')
| -rw-r--r-- | ADTs/adts.b | 52 |
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; +} |
