shithub: limbobyexample

Download patch

ref: 1f76d9d4cf660c5fb66d406c5488ce4d734d8e25
parent: b88feaef76f1c93fc3e0c4125a8bbb2f536878e3
author: henesy <henesy.dev@gmail.com>
date: Mon Mar 11 13:39:03 EDT 2019

more work on generics

--- a/Generics/README.md
+++ b/Generics/README.md
@@ -1,22 +1,78 @@
 # Generics
 
+Limbo supports polymorphic types as well as a form of pseudo-unions and pseudo-interfaces as per C and Go respectively. 
 
-
 Warning: This is an example about an undocumented feature of Limbo. All assertions or explanations provided are considered conjecture until proven otherwise. 
 
 ## Source
 
-###
+### generics.b:17,21
 
+
+
+### generics.b:23,32
+
+
+
+### generics.b:34,44
+
+
+
+### generics.b:46,50
+
+
+
+### generics.b:56,63
+
+
+
+`.ws()` is defined at: generics.b:103,109
+
+### generics.b:65,69
+
+
+
+### generics.b:71,83
+
+
+
+`ismember()` is defined at: generics.b:132,144
+
+`.eq()` is defined at: generics.b:111,114
+
+### generics.b:85,87
+
+
+
+`rev()` is defined at: generics.b:154,161
+
+### generics.b:89,98
+
+
+
+`pair()` is defined at: generics.b:146,152
+
 ## Demo
 
+	; generics
+	Type something: asdf
+	Broke on 'a'
+	5
+	Five
+	Found 9!
+	Head was: :(
+	Head is: ☺
+	Head of plist: ( hello, { :(, 7 } )
+	; 
+
 ## Exercises
 
-- Can you find a way to make the eq() function do a deep comparison of Int's?
+- Can you find a way to make the `eq()` function do a deep comparison of `Int`'s?
 - Try removing the `.String` from the `words` definition, what happens?
 - Try removing `ref anywhere, see what happens.
 
 ## References
 
-- https://github.com/caerwynj/inferno-lab/blob/master/27/sexprs.b
 - https://github.com/caerwynj/inferno-lab/blob/master/78/README.md
+- https://github.com/caerwynj/inferno-lab/blob/master/27/sexprs.b
+- /appl/lib/lists.b
--- a/Generics/generics.b
+++ b/Generics/generics.b
@@ -73,9 +73,9 @@
 	smiley := "☺";
 	frowny := ":(";
 
+	# Format is: Adt[Type].PickTag(fields...)
 	sword := ref Word[Int].String(Int(9), smiley);
 
-	# Format is: Adt[Type].PickTag(fields...)
 	words = sword :: words;
 	words = ref Word[Int].String(Int(7), frowny) :: words;
 
@@ -82,6 +82,21 @@
 	if(ismember(sword, words))
 		print("Found %d!\n", sword.w.d);
 
+	backwords := rev(words);
+
+	print("Head was: %s\nHead is: %s\n", (hd words).s, (hd backwords).s);
+
+	strings: list of string;
+	strings = "hi" :: strings;
+	strings = "hello" :: strings;
+
+	# plist is a `list of (string, ref Word.String)`
+	plist := pair(strings, words);
+
+	(str, word) := hd plist;
+
+	print("Head of plist: ( %s, { %s, %d } )\n", str, word.s, word.w.d);
+
 	exit;
 }
 
@@ -117,7 +132,8 @@
 # Checks if x is a member of l
 ismember[T](x: T, l: list of T): int
 	for {
-		T =>	eq:	fn(a, b: T): int;
+		T =>
+			eq:	fn(a, b: T): int;
 	}
 {
 	for(; l != nil; l = tl l)