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")))
Другие вопросы по тегам