在J中就地修改列表元素是否可以完成?

时间:2011-09-16 23:24:13

标签: functional-programming j tacit-programming

3 个答案:

答案 0 :(得分:2)

分配如

arr=. 'z' 15} arr

执行到位。 (有关其他支持的就地操作,请参阅JWiki article) 口译员确定只更新arr的一小部分,并且不会创建重新分配的全新列表。

在你的情况下发生的事情不是重新分配该数组,而是它以小增量增长很多次,导致内存分配和重新分配。

如果您预先分配(通过为其分配一些大块数据),那么您可以使用}修改它,而不会受到太多惩罚。

答案 1 :(得分:1)

在我提出这个问题后,说实话,我忘记了这个网站。

是的,答案是该语言没有形式意味着“更新到位,但如果你使用两种形式

x =:x,大多数事情

x =:大多数事情} x

然后解释器将这些视为特殊并且在适当的位置更新,除非它不能。口译员还承认了许多其他特价,例如:

199(1000& | @ ^)199

该组合操作是模幂运算。它从不计算整个指数,如

199(1000安培; | ^)199

会 - 只是在没有@的情况下结束_。

因此值得阅读关于特价的文章。我会标记别人的答案。

答案 2 :(得分:0)

上面提供的sverre链接(http://www.jsoftware.com/jwiki/Essays/In-Place%20Operations)显示了支持修改现有阵列而不是创建新阵列的各种操作。它们包括:

    myarray=: myarray,'blah'

如果您对lookandsay序列的默认版本感兴趣,请参阅this submission到RosettaCode:

   las=: ,@((# , {.);.1~ 1 , 2 ~:/\ ])&.(10x&#.inv)@]^:(1+i.@[)
   5 las 1
11 21 1211 111221 312211