about summary refs log tree commit diff stats
path: root/063list.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-11-04 12:43:37 -0800
committerKartik K. Agaram <vc@akkartik.com>2015-11-04 12:43:37 -0800
commit4c3e1f0780da52c72be467c6bfd3b2073ce57190 (patch)
tree3d8be34f7157aa019cf8f191bb8e1cfb51cde251 /063list.mu
parenta072f67493c04b0e89b601839d41edac3f7432db (diff)
downloadmu-4c3e1f0780da52c72be467c6bfd3b2073ce57190.tar.gz
2353 - now 'list' type can be fully generic!
Diffstat (limited to '063list.mu')
-rw-r--r--063list.mu65
1 files changed, 34 insertions, 31 deletions
diff --git a/063list.mu b/063list.mu
index 0c07961d..a1076792 100644
--- a/063list.mu
+++ b/063list.mu
@@ -1,54 +1,57 @@
 # A list links up multiple objects together to make them easier to manage.
 #
-# Try to make all objects in a single list of the same type, it'll help avoid bugs.
-# If you want to store multiple types in a single list, use an exclusive-container.
+# The objects must be of the same type. If you want to store multiple types in
+# a single list, use an exclusive-container.
 
-container list [
-  value:location
-  next:address:list
+container list:_elem [
+  value:_elem
+  next:address:list:_elem
 ]
 
-# result:address:list <- push x:location, in:address:list
-recipe push [
+recipe push x:_elem, in:address:list:_elem -> result:address:list:_elem [
   local-scope
-  x:location <- next-ingredient
-  in:address:list <- next-ingredient
-  result:address:list <- new list:type
-  val:address:location <- get-address *result, value:offset
+  load-ingredients
+  result <- new {(list _elem): type}
+  val:address:_elem <- get-address *result, value:offset
   *val <- copy x
-  next:address:address:list <- get-address *result, next:offset
+  next:address:address:list:_elem <- get-address *result, next:offset
   *next <- copy in
   reply result
 ]
 
-# result:location <- first in:address:list
-recipe first [
+recipe first in:address:list:_elem -> result:_elem [
   local-scope
-  in:address:list <- next-ingredient
-  result:location <- get *in, value:offset
-  reply result
+  load-ingredients
+  result <- get *in, value:offset
 ]
 
 # result:address:list <- rest in:address:list
-recipe rest [
+recipe rest in:address:list:_elem -> result:address:list:_elem [
   local-scope
-  in:address:list <- next-ingredient
-  result:address:list <- get *in, next:offset
-  reply result
+  load-ingredients
+  result <- get *in, next:offset
+]
+
+recipe force-specialization-list-number [
+  1:address:list:number <- push 2:number, 1:address:list:number
+  2:number <- first 1:address:list:number
+  1:address:list:number <- rest 1:address:list:number
 ]
 
+# todo: automatically specialize code in scenarios
 scenario list-handling [
   run [
-    1:address:list <- copy 0
-    1:address:list <- push 3, 1:address:list
-    1:address:list <- push 4, 1:address:list
-    1:address:list <- push 5, 1:address:list
-    2:number <- first 1:address:list
-    1:address:list <- rest 1:address:list
-    3:number <- first 1:address:list
-    1:address:list <- rest 1:address:list
-    4:number <- first 1:address:list
-    1:address:list <- rest 1:address:list
+    1:address:list:number <- copy 0
+    2:number <- copy 3
+    1:address:list:number <- push 2:number, 1:address:list:number
+    1:address:list:number <- push 4, 1:address:list:number
+    1:address:list:number <- push 5, 1:address:list:number
+    2:number <- first 1:address:list:number
+    1:address:list:number <- rest 1:address:list:number
+    3:number <- first 1:address:list:number
+    1:address:list:number <- rest 1:address:list:number
+    4:number <- first 1:address:list:number
+    1:address:list:number <- rest 1:address:list:number
   ]
   memory-should-contain [
     1 <- 0  # empty to empty, dust to dust..