Есть ли способ заменить значение элемента списка или словаря индексом в Hy? Кажется, что nth
функция не соответствует квадратной скобке Python.
Я ожидал следующего перевода.
(setv lst [1 2 3])
(setv (nth lst 1) 20)
lst=[1, 2, 3]
lst[1]=20
Согласно документации, вы должны использовать функцию- assoc
функцию для установки значения по определенному индексу в списке. Таким образом, ваш код должен быть:
(assoc lst 1 20)
Это должно дать желаемый результат.
Кроме assoc
, Hy можно также использовать setv
на get
специальной формы или на .
формы с синтаксисом []
для установки по индексу или ключу.
$ 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__
напрямую не рекомендуется по сравнению с другими вышеупомянутыми формами, но иногда может быть полезно в функциях более высокого порядка.