【问题标题】:How to completely replace a key with `lein change`如何用“lein change”完全替换密钥
【发布时间】:2016-05-03 07:54:01
【问题描述】:

我对 Clojure 还很陌生,我只是想了解 leiningen 可以做的所有有趣的事情。看起来很酷的一件事是lein change,它允许您提供一个函数和参数以应用于project.clj 中的一个键。因此,如果您的 :url 值为 https://www.example.com,您可以运行

lein change url str "/myproject"

运行(str (:url project) "/myproject")(假设项目结构像地图一样工作)。很酷。

我的问题是:有没有一种简洁的方法可以使用lein change 来完全替换密钥?我可以看到我需要向lein change 提供一个函数,该函数忽略它的第一个参数,并返回它的第二个参数。如果有这样的函数——称之为clobber——那么我可以运行:

lein change url clobber "https://new.example.com"

会变成(clobber (:url project) "https://new.example.com")

有没有像clobber 这样工作的内置函数,还是我必须用->> 做一些黑魔法?

注意:我意识到我可以打开文件并更改值,但我想为这个难题找到一个优雅的解决方案!

【问题讨论】:

    标签: clojure functional-programming leiningen


    【解决方案1】:

    lein change 接受伪函数set 表示“替换”:

    lein change url set "http://example.com"
    

    【讨论】:

    • 非常感谢。这在某处的某些文档中吗?我根本找不到关于lein change 的太多信息。
    • 可能是这样。之前没有听说过lein change,我只是查看了它的来源,找到了github.com/technomancy/leiningen/blob/master/src/leiningen/…
    • 很公平。我会给自己做一个 TODO 笔记,以发送一个 PR 将其添加到 lein 文档中。查看该定义,似乎lein change url ->> ((constantly "foo")) 应该可以工作, 一些转义——如果我只想使用来自clojure.core 的真实函数/宏来解决我的问题。虽然我不能让它在练习中打球,可能是因为->> 是一个宏。
    • 如果这行得通,我会感到非常惊讶。 lein change 只接受 clojure.core 中的函数,不接受您使用 constantly 构建的函数,当然也不接受任意的 clojure 表达式。
    猜你喜欢
    • 2021-08-13
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2017-08-07
    • 2012-11-24
    相关资源
    最近更新 更多