c{0: 0 (((1 channel-address)) <- ((init-channel)) ((1 literal))) -- nil c{0: 1 (((2 integer)) <- ((copy)) ((34 literal))) -- nil c{0: 2 (((3 tagged-value)) <- ((save-type)) ((2 integer))) -- nil c{0: 3 (((1 channel-address) (deref)) <- ((write)) ((1 channel-address)) ((3 tagged-value))) -- nil c{0: 4 (((5 integer)) <- ((get)) ((1 channel-address) (deref)) ((first-free offset))) -- nil c{0: 5 (_ ((1 channel-address) (deref)) <- ((read)) ((1 channel-address))) -- nil c{0: 6 (((1 channel-address) (deref)) <- ((write)) ((1 channel-address)) ((3 tagged-value))) -- nil c{0: 7 (((6 integer)) <- ((get)) ((1 channel-address) (deref)) ((first-free offset))) -- nil c{1: 0 ✓ (((1 channel-address)) <- ((init-channel)) ((1 literal))) c{1: 1 ✓ (((2 integer)) <- ((copy)) ((34 literal))) c{1: 2 ✓ (((3 tagged-value)) <- ((save-type)) ((2 integer))) c{1: 3 ✓ (((1 channel-address) (deref)) <- ((write)) ((1 channel-address)) ((3 tagged-value))) c{1: 4 ✓ (((5 integer)) <- ((get)) ((1 channel-address) (deref)) ((first-free offset))) c{1: 5 ✓ (_ ((1 channel-address) (deref)) <- ((read)) ((1 channel-address))) c{1: 6 ✓ (((1 channel-address) (deref)) <- ((write)) ((1 channel-address)) ((3 tagged-value))) c{1: 7 ✓ (((6 integer)) <- ((get)) ((1 channel-address) (deref)) ((first-free offset))) cn0: convert-names in main cn0: (((1 channel-address)) <- ((init-channel)) ((1 literal))) nil nil cn0: checking arg ((1 literal)) cn0: checking oarg ((1 channel-address)) maybe-add: ((1 channel-address)) cn0: (((2 integer)) <- ((copy)) ((34 literal))) nil nil cn0: checking arg ((34 literal)) cn0: checking oarg ((2 integer)) maybe-add: ((2 integer)) cn0: (((3 tagged-value)) <- ((save-type)) ((2 integer))) nil nil cn0: checking arg ((2 integer)) maybe-add: ((2 integer)) cn0: checking oarg ((3 tagged-value)) maybe-add: ((3 tagged-value)) cn0: (((1 channel-address) (deref)) <- ((write)) ((1 channel-address)) ((3 tagged-value))) nil nil cn0: checking arg ((1 channel-address)) maybe-add: ((1 channel-address)) cn0: checking arg ((3 tagged-value)) maybe-add: ((3 tagged-value)) cn0: checking oarg ((1 channel-address) (deref)) maybe-add: ((1 channel-address) (deref)) cn0: (((5 integer)) <- ((get)) ((1 channel-address) (deref)) ((first-free offset))) nil nil cn0: field-access first-free in 1channel-addressderef of type channel cn0: new field; computing location cn0: field location 1 cn0: checking arg ((1 channel-address) (deref)) maybe-add: ((1 channel-address) (deref)) cn0: checking arg ((first-free offset)) cn0: checking oarg ((5 integer)) maybe-add: ((5 integer)) cn0: (_ ((1 channel-address) (deref)) <- ((read)) ((1 channel-address))) ((first-free 1)) ((first-free t)) cn0: checking arg ((1 channel-address)) maybe-add: ((1 channel-address)) cn0: checking oarg _ cn0: checking oarg ((1 channel-address) (deref)) maybe-add: ((1 channel-address) (deref)) cn0: (((1 channel-address) (deref)) <- ((write)) ((1 channel-address)) ((3 tagged-value))) ((first-free 1)) ((first-free t)) cn0: checking arg ((1 channel-address)) maybe-add: ((1 channel-address)) cn0: checking arg ((3 tagged-value)) maybe-add: ((3 tagged-value)) cn0: checking oarg ((1 channel-address) (deref)) maybe-add: ((1 channel-address) (deref)) cn0: (((6 integer)) <- ((get)) ((1 channel-address) (deref)) ((first-free offset))) ((first-free 1)) ((first-free t)) cn0: field-access first-free in 1channel-addressderef of type channel cn0: checking arg ((1 channel-address) (deref)) maybe-add: ((1 channel-address) (deref)) cn0: checking arg ((first-free offset)) cn0: checking oarg ((6 integer)) maybe-add: ((6 integer)) cn1: (((1 channel-address)) <- ((init-channel)) ((1 literal))) cn1: (((2 integer)) <- ((copy)) ((34 literal))) cn1: (((3 tagged-value)) <- ((save-type)) ((2 integer))) cn1: (((1 channel-address) (deref)) <- ((write)) ((1 channel-address)) ((3 tagged-value))) cn1: (((5 integer)) <- ((get)) ((1 channel-address) (deref)) ((1 offset))) cn1: (_ ((1 channel-address) (deref)) <- ((read)) ((1 channel-address))) cn1: (((1 channel-address) (deref)) <- ((write)) ((1 channel-address)) ((3 tagged-value))) cn1: (((6 integer)) <- ((get)) ((1 channel-address) (deref)) ((1 offset))) schedule: main run: main 0: (((1 channel-address)) <- ((init-channel)) ((1 literal))) run: init-channel/main 0: (((default-space space-address)) <- ((new)) ((space literal)) ((30 literal))) run: init-channel/main 0: 1000 => ((default-space space-address)) run: init-channel/main 1: (((1 channel-address)) <- ((new)) ((channel literal))) run: init-channel/main 1: 1031 => ((1 channel-address)) mem: ((1 channel-address)): 1002 <= 1031 run: init-channel/main 2: (((2 integer-address)) <- ((get-address)) ((1 channel-address) (deref)) ((0 offset))) run: init-channel/main 2: 1031 => ((2 integer-address)) mem: ((2 integer-address)): 1003 <= 1031 run: init-channel/main 3: (((2 integer-address) (deref)) <- ((copy)) ((0 literal))) run: init-channel/main 3: 0 => ((2 integer-address) (deref)) mem: ((2 integer-address) (deref)): 1031 <= 0 run: init-channel/main 4: (((3 integer-address)) <- ((get-address)) ((1 channel-address) (deref)) ((1 offset))) run: init-channel/main 4: 1032 => ((3 integer-address)) mem: ((3 integer-address)): 1004 <= 1032 run: init-channel/main 5: (((3 integer-address) (deref)) <- ((copy)) ((0 literal))) run: init-channel/main 5: 0 => ((3 integer-address) (deref)) mem: ((3 integer-address) (deref)): 1032 <= 0 run: init-channel/main 6: (((4 integer)) <- ((next-input))) arg: nil 0 (1) run: init-channel/main 6: 1 => ((4 integer)) mem: ((4 integer)): 1005 <= 1 run: init-channel/main 7: (((4 integer)) <- ((add)) ((4 integer)) ((1 literal))) mem: ((4 integer)) => 1 run: init-channel/main 7: 2 => ((4 integer)) mem: ((4 integer)): 1005 <= 2 run: init-channel/main 8: (((5 tagged-value-array-address-address)) <- ((get-address)) ((1 channel-address) (deref)) ((2 offset))) run: init-channel/main 8: 1033 => ((5 tagged-value-array-address-address)) mem: ((5 tagged-value-array-address-address)): 1006 <= 1033 run: init-channel/main 9: (((5 tagged-value-array-address-address) (deref)) <- ((new)) ((tagged-value-array literal)) ((4 integer))) mem: ((4 integer)) => 2 run: init-channel/main 9: 1034 => ((5 tagged-value-array-address-address) (deref)) mem: ((5 tagged-value-array-address-address) (deref)): 1033 <= 1034 run: init-channel/main 10: (((reply)) ((1 channel-address))) mem: ((1 channel-address)) => 1031 run: main 0: 1031 => ((1 channel-address)) mem: ((1 channel-address)): 1 <= 1031 run: main 1: (((2 integer)) <- ((copy)) ((34 literal))) run: main 1: 34 => ((2 integer)) mem: ((2 integer)): 2 <= 34 run: main 2: (((3 tagged-value)) <- ((save-type)) ((2 integer))) mem: ((2 integer)) => 34 run: main 2: #(tagged record (integer 34)) => ((3 tagged-value)) mem: ((3 tagged-value)): 3 <= integer mem: ((3 tagged-value)): 4 <= 34 run: main 3: (((1 channel-address) (deref)) <- ((write)) ((1 channel-address)) ((3 tagged-value))) mem: ((1 channel-address)) => 1031 mem: ((3 tagged-value)) => #(tagged record (integer 34 . nil)) run: write/main 0: (((default-space space-address)) <- ((new)) ((space literal)) ((30 literal))) run: write/main 0: 1039 => ((default-space space-address)) run: write/main 1: (((1 channel-address)) <- ((next-input))) arg: nil 0 (1031 #(tagged record (integer 34 . nil))) run: write/main 1: 1031 => ((1 channel-address)) mem: ((1 channel-address)): 1041 <= 1031 run: write/main 2: (((2 tagged-value)) <- ((next-input))) arg: nil 1 (1031 #(tagged record (integer 34 . nil))) run: write/main 2: #(tagged record (integer 34 . nil)) => ((2 tagged-value)) mem: ((2 tagged-value)): 1042 <= integer mem: ((2 tagged-value)): 1043 <= 34 run: write/main 3: (((4 boolean)) <- ((full?)) ((1 channel-address) (deref))) mem: ((1 channel-address) (deref)) => #(tagged record (0 0 1034 . nil)) run: full?/write/main 0: (((default-space space-address)) <- ((new)) ((space literal)) ((30 literal))) run: full?/write/main 0: 1070 => ((default-space space-address)) run: full?/write/main 1: (((1 channel)) <- ((next-input))) arg: nil 0 (#(tagged record (0 0 1034 . nil))) run: full?/write/main 1: #(tagged record (0 0 1034 . nil)) => ((1 channel)) mem: ((1 channel)): 1072 <= 0 mem: ((1 channel)): 1073 <= 0 mem: ((1 channel)): 1074 <= 1034 run: full?/write/main 2: (((4 integer)) <- ((get)) ((1 channel)) ((1 offset))) mem: ((1073 integer) (raw)) => 0 run: full?/write/main 2: 0 => ((4 integer)) mem: ((4 integer)): 1075 <= 0 run: full?/write/main 3: (((4 integer)) <- ((add)) ((4 integer)) ((1 literal))) mem: ((4 integer)) => 0 run: full?/write/main 3: 1 => ((4 integer)) mem: ((4 integer)): 1075 <= 1 run: full?/write/main 4: (((5 integer)) <- ((capacity)) ((1 channel))) mem: ((1 channel)) => #(tagged record (0 0 1034 . nil)) run: capacity/full?/write/main 0: (((default-space space-address)) <- ((new)) ((space literal)) ((30 literal))) run: capacity/full?/write/main 0: 1101 => ((default-space space-address)) run: capacity/full?/write/main 1: (((1 channel)) <- ((next-input))) arg: nil 0 (#(tagged record (0 0 1034 . nil))) run: capacity/full?/write/main 1: #(tagged record (0 0 1034 . nil)) => ((1 channel)) mem: ((1 channel)): 1103 <= 0 mem: ((1 channel)): 1104 <= 0 mem: ((1 channel)): 1105 <= 1034 run: capacity/full?/write/main 2: (((4 tagged-value-array-address)) <- ((get)) ((1 channel)) ((2 offset))) mem: ((1105 tagged-value-array-address) (raw)) => 1034 run: capacity/full?/write/main 2: 1034 => ((4 tagged-value-array-address)) mem: ((4 tagged-value-array-address)): 1106 <= 1034 run: capacity/full?/write/main 3: (((5 integer)) <- ((length)) ((4 tagged-value-array-address) (deref))) array-len: ((4 tagged-value-array-address) (deref)) mem: ((1034 integer) (raw)) => 2 run: capacity/full?/write/main 3: 2 => ((5 integer)) mem: ((5 integer)): 1107 <= 2 run: capacity/full?/write/main 4: (((reply)) ((5 integer))) mem: ((5 integer)) => 2 run: full?/write/main 4: 2 => ((5 integer)) mem: ((5 integer)): 1076 <= 2 run: full?/write/main 5: (((6 boolean)) <- ((less-than)) ((4 integer)) ((5 integer))) mem: ((4 integer)) => 1 mem: ((5 integer)) => 2 run: full?/write/main 5: t => ((6 boolean)) mem: ((6 boolean)): 1077 <= t run: full?/write/main 6: (((jump-if)) ((6 boolean)) ((1 offset))) mem: ((6 boolean)) => t run: full?/write/main 8: (((7 integer)) <- ((get)) ((1 channel)) ((0 offset))) mem: ((1072 integer) (raw)) => 0 run: full?/write/main 8: 0 => ((7 integer)) mem: ((7 integer)): 1078 <= 0 run: full?/write/main 9: (((8 boolean)) <- ((equal)) ((7 integer)) ((4 integer))) mem: ((7 integer)) => 0 mem: ((4 integer)) => 1 run: full?/write/main 9: nil => ((8 boolean)) mem: ((8 boolean)): 1079 <= nil run: full?/write/main 10: (((reply)) ((8 boolean))) mem: ((8 boolean)) => nil run: write/main 3: nil => ((4 boolean)) mem: ((4 boolean)): 1044 <= nil run: write/main 4: (((jump-unless)) ((4 boolean)) ((2 offset))) mem: ((4 boolean)) => nil run: write/main 7: (((6 tagged-value-array-address)) <- ((get)) ((1 channel-address) (deref)) ((2 offset))) mem: ((1033 tagged-value-array-address) (raw)) => 1034 run: write/main 7: 1034 => ((6 tagged-value-array-address)) mem: ((6 tagged-value-array-address)): 1046 <= 1034 run: write/main 8: (((7 integer-address)) <- ((get-address)) ((1 channel-address) (deref)) ((1 offset))) run: write/main 8: 1032 => ((7 integer-address)) mem: ((7 integer-address)): 1047 <= 1032 run: write/main 9: (((8 tagged-value-address)) <- ((index-address)) ((6 tagged-value-array-address) (deref)) ((7 integer-address) (deref))) mem: ((7 integer-address) (deref)) => 0 array-len: ((1034 tagged-value-array) (raw)) mem: ((1034 integer) (raw)) => 2 run: write/main 9: 1035 => ((8 tagged-value-address)) mem: ((8 tagged-value-address)): 1048 <= 1035 run: write/main 10: (((8 tagged-value-address) (deref)) <- ((copy)) ((2 tagged-value))) mem: ((2 tagged-value)) => #(tagged record (integer 34 . nil)) run: write/main 10: #(tagged record (integer 34 . nil)) => ((8 tagged-value-address) (deref)) mem: ((8 tagged/ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
scenario array-from-args [
  run [
    local-scope
    x:&:@:num <- new-array 0, 1, 2
    10:@:num/raw <- copy *x
  ]
  memory-should-contain [
    10 <- 3  # array length
    11 <- 0
    12 <- 1
    13 <- 2
  ]
]

# create an array out of a list of args
def new-array -> result:&:@:_elem [
  local-scope
  capacity:num <- copy 0
  {
    # while read curr-value
    curr-value:_elem, exists?:bool <- next-input
    break-unless exists?
    capacity <- add capacity, 1
    loop
  }
  result <- new _elem:type, capacity
  rewind-inputs
  i:num <- copy 0
  {
    # while read curr-value
    done?:bool <- greater-or-equal i, capacity
    break-if done?
    curr-value:_elem, exists?:bool <- next-input
    assert exists?, [error in rewinding inputs to new-array]
    *result <- put-index *result, i, curr-value
    i <- add i, 1
    loop
  }
  return result
]

# fill an existing array with a set of numbers
# (contributed by Caleb Couch)
def fill array:&:@:num -> array:&:@:num [
  local-scope
  load-inputs
  loopn:num <- copy 0