为Pony数组实现map函数

时间:2019-02-24 08:49:17

标签: ponylang

我一直在使用Pony数组来更好地了解Pony,并想为任何数组编写map函数。

我说的是像标准地图函数这样的东西,如今大多数语言都具有转换集合元素的能力,例如Clojure:

(map #(+ 1 %) [1 2 3]) ; => [2 3 4]

但是我希望它实际上修改给定的数组,而不是返回一个新的数组。

由于能力,到目前为止,我目前的尝试会遇到很多错误:

// 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

任何人都知道该怎么做

1 个答案:

答案 0 :(得分:1)

好的,花了我一段时间,但是我能够使事情正常进行。

这是我对正在发生的事情的基本了解(如果我错了,请纠正我)!

第一步是要了解我们需要使用别名来更改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发送给任何人!