diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-11-04 12:43:37 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-11-04 12:43:37 -0800 |
commit | 4c3e1f0780da52c72be467c6bfd3b2073ce57190 (patch) | |
tree | 3d8be34f7157aa019cf8f191bb8e1cfb51cde251 /063list.mu | |
parent | a072f67493c04b0e89b601839d41edac3f7432db (diff) | |
download | mu-4c3e1f0780da52c72be467c6bfd3b2073ce57190.tar.gz |
2353 - now 'list' type can be fully generic!
Diffstat (limited to '063list.mu')
-rw-r--r-- | 063list.mu | 65 |
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.. |