hylang替换多个单词

时间:2015-10-08 12:36:44

标签: string replace hy

我想在 hylang

中对字符串执行多次替换操作

鉴于 hy python 非常相似,我在Python replace multiple strings上找到了相关解决方案

# 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中lambda函数的reduce参数被解释为单个arg(例如["hello" "bye"])而不是两个args "hello"& "bye"

在python中,我可以使用* - 运算符将列表取消引用到参数中,但似乎我不能在hy中这样做。

(defn replace [s repls]
    (reduce (fn [a kv] (.replace a *kv)) repls s))
> NameError: global name '*kv' is not defined

是否有一种优雅的方式

  • 将列表展开为参数
  • AND / OR 替换字符串中的多个单词

hy

1 个答案:

答案 0 :(得分: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")))