用 Hy 中的索引替换 list/dictionary 元素

Substitution of list/dictionary element by the index in Hy

有什么方法可以用Hy中的索引替换列表或字典元素的值吗? nth函数好像不对应Python的方括号。

我期待的是下面的翻译。

(setv lst [1 2 3])
(setv (nth lst 1) 20)

lst=[1, 2, 3]
lst[1]=20

根据 the documentation,您必须使用 assoc 函数在列表中的特定索引处设置值。因此,您的代码应该是:

(assoc lst 1 20)

这应该会给出预期的结果。

除了 assoc,Hy 还可以在 get 特殊形式或 . 形式上使用 setv,并使用 [] 语法设置为索引或键。

$ hy --spy  # Shows Python translation.
[...]
=> (setv lst [1 2 3])
lst = [1, 2, 3]
None

=> (setv (. lst[1]) 20)
lst[1] = 20
None

=> lst
lst

[1, 20, 3]
=> (setv (get lst 2) 30)
lst[2] = 30
None

=> lst
lst

[1, 20, 30]

当然,这些运算符最终由 __setitem__ 方法支持,您可以像调用任何其他方法一样调用它。

=> (.__setitem__ lst 0 10)
lst.__setitem__(0, 10)

=> lst
lst

[10, 20, 30]

与上述其他形式相比,不推荐直接使用 __setitem__,但它有时在高阶函数中很有用。