Hylang заменить несколько слов
Я хотел бы выполнить несколько операций замены на строку, в Hylang
Учитывая, что Hy очень похож на Python, я нашел соответствующее решение на Python заменить несколько строк
# python
def replace(s, repls):
reduce(lambda a, kv: a.replace(*kv), repls, s)
replace("hello, world", [["hello", "goodbye"],["world", "earth"]])
> 'goodbye, earth'
поэтому я попытался перенести его на Hy:
;hy
(defn replace [s repls]
(reduce (fn [a kv] (.replace a kv)) repls s))
(replace "hello, world", [["hello" "bye"] ["earth" "moon"]])
> TypeError: replace() takes at least 2 arguments (1 given)
это не удается, так как kv
аргумент лямбда-функции в reduce
интерпретируется как один аргумент (например, ["hello" "bye"]
) вместо двух аргументов "hello"
& "bye"
,
В питоне я могу использовать *
-оператор, чтобы разыменовать список аргументам, но, кажется, я не могу сделать это в Hy.
(defn replace [s repls]
(reduce (fn [a kv] (.replace a *kv)) repls s))
> NameError: global name '*kv' is not defined
Есть ли элегантный способ
- расширить списки в качестве аргументов
- И / ИЛИ для замены нескольких слов в строке
в hy
?
1 ответ
Решение
Уловка, кажется, состоит в том, чтобы использовать (apply)
(defn replace-words
[s repls]
(reduce (fn [a kv] (apply a.replace kv)) repls s))
(replace-words "hello, world" (, (, "hello" "goodbye") (, "world" "blue sky")))