diff options
Diffstat (limited to 'Lists')
| -rw-r--r-- | Lists/README.md | 37 | ||||
| -rw-r--r-- | Lists/lists.b | 38 |
2 files changed, 67 insertions, 8 deletions
diff --git a/Lists/README.md b/Lists/README.md index 3daa129..5b892ad 100644 --- a/Lists/README.md +++ b/Lists/README.md @@ -1,17 +1,48 @@ # Lists -Limbo supports lists of a type as a basic construct. +Limbo supports lists of arbitrary types as a basic construct. ## Source -### +### lists.b:16,20 +Three lists are declared. +The `len` statement can be used on a list to return the number of elements in the respective list. Note that the list `persons` is a list of tuples whose pairing is that of a string and an integer. -## Demo +### lists.b:22,28 + +The lists `names` and `ages` are both populated. + +The `::` operator functions on lists by prepending the given element before the head of the current list. Note the interaction between successive calls to the `::` operator prior to assignment and how it affects order. + +### lists.b:30,46 + +The list `persons` is built by making copies of the `names` and `ages` lists as `n` and `a`, respectively. +The `hd` statement returns the head of the list to its right. + +The `tl` statement returns the tail, that is the list bar the head element, of the list to its right. + +An empty list is equivocal to `nil`. That is, a nil list is an empty list. + +Note: The effects upon temporary copies of `names` and `ages` do not affect the original lists they are copies of, as the temporary copies are copies, rather than references to the original lists. + +## Demo + ; limbo lists.b + ; lists + Lens: 0, 0, 0 + Lens: 3, 3, 0 + Persons: + Spike: 27 + Jet: 36 + Ed: 13 + Tmp lens: 0, 0 + Lens: 3, 3, 0 + ; ## Exercises - Try reversing a list. +- Try interleaving two lists. diff --git a/Lists/lists.b b/Lists/lists.b index 0837c8a..924c05e 100644 --- a/Lists/lists.b +++ b/Lists/lists.b @@ -3,19 +3,47 @@ implement Lists; include "sys.m"; include "draw.m"; -include "arg.m"; - sys: Sys; print: import sys; Lists: module { - init: fn(nil: ref Draw->Context, argv: list of string); + init: fn(nil: ref Draw->Context, nil: list of string); }; -init(nil: ref Draw->Context, argv: list of string) { +init(nil: ref Draw->Context, nil: list of string) { sys = load Sys Sys->PATH; - + names: list of string; + ages: list of int; + persons: list of (string, int); + + print("Lens: %d, %d, %d\n", len names, len ages, len persons); + + names = "Spike" :: names; + ages = 27 :: ages; + + names = "Ed" :: "Jet" :: names; + ages = 13 :: 36 :: ages; + + print("Lens: %d, %d, %d\n", len names, len ages, len persons); + + n := names; + a := ages; + + while(n != nil && a != nil) { + persons = (hd n, hd a) :: persons; + n = tl n; + a = tl a; + } + + print("Persons:\n"); + for(; persons != nil; persons = tl persons) { + (name, age) := hd persons; + print("%s: %d\n", name, age); + } + + print("Tmp lens: %d, %d\n", len n, len a); + print("Lens: %d, %d, %d\n", len names, len ages, len persons); exit; } |
