为 Pony 数组实现 map 函数
Implementing the map function for a Pony array
我一直在玩 Pony 数组以更好地理解 Pony,并想为任何数组编写 map 函数。
我说的是像现在大多数语言用于转换集合元素的标准映射函数,就像在 Clojure 中一样:
(map #(+ 1 %) [1 2 3]) ; => [2 3 4]
但我希望它实际修改给定数组,而不是 return 一个新数组。
我目前的尝试由于能力问题遇到了很多错误:
// array is "iso" so I can give it to another actor and change it
let my_array: Array[U64] iso = [1; 2; 3; 4]
// other actor tries to recover arrays as "box" just to call pairs() on it
let a = recover box my_array end // ERROR: can't recover to this capability
for (i, item) in a.pairs() do
// TODO set item at i to some other mapped value
try my_array.update(i, fun(item))? end
end
任何人都知道如何做到这一点
好吧,花了我一段时间,但我能够让事情正常进行。
这是我的基本理解(如有错误请指正)!
第一步是了解我们需要使用别名来更改 Pony 中变量的功能。
因此,为了使一个 iso 变量可用作一个盒子,基本上必须将其别名,将其消耗到另一个变量中:
let a: Array[U64] ref = consume array // array is "iso"
for (i, item) in a.pairs() do
try a.update(i, item + n)? end
end
这有效!!
我遇到的另一个问题是我无法对结果 Array[U64] ref
做太多事情。例如,不能将其传递给任何人。
所以我将整个东西包装到一个 recover
块中,以便以相同的数组结束,但是作为一个 val
(对数组的不可变引用)更有用,因为我可以发给其他演员:
let result = recover val
let a: Array[U64] ref = consume array
for (i, item) in a.pairs() do
try a.update(i, item + n)? end
end
a
end
现在我可以发送 result
给任何人了!
我一直在玩 Pony 数组以更好地理解 Pony,并想为任何数组编写 map 函数。
我说的是像现在大多数语言用于转换集合元素的标准映射函数,就像在 Clojure 中一样:
(map #(+ 1 %) [1 2 3]) ; => [2 3 4]
但我希望它实际修改给定数组,而不是 return 一个新数组。
我目前的尝试由于能力问题遇到了很多错误:
// array is "iso" so I can give it to another actor and change it
let my_array: Array[U64] iso = [1; 2; 3; 4]
// other actor tries to recover arrays as "box" just to call pairs() on it
let a = recover box my_array end // ERROR: can't recover to this capability
for (i, item) in a.pairs() do
// TODO set item at i to some other mapped value
try my_array.update(i, fun(item))? end
end
任何人都知道如何做到这一点
好吧,花了我一段时间,但我能够让事情正常进行。
这是我的基本理解(如有错误请指正)!
第一步是了解我们需要使用别名来更改 Pony 中变量的功能。
因此,为了使一个 iso 变量可用作一个盒子,基本上必须将其别名,将其消耗到另一个变量中:
let a: Array[U64] ref = consume array // array is "iso"
for (i, item) in a.pairs() do
try a.update(i, item + n)? end
end
这有效!!
我遇到的另一个问题是我无法对结果 Array[U64] ref
做太多事情。例如,不能将其传递给任何人。
所以我将整个东西包装到一个 recover
块中,以便以相同的数组结束,但是作为一个 val
(对数组的不可变引用)更有用,因为我可以发给其他演员:
let result = recover val
let a: Array[U64] ref = consume array
for (i, item) in a.pairs() do
try a.update(i, item + n)? end
end
a
end
现在我可以发送 result
给任何人了!