【问题标题】:Using Clojure in Repl without opening en closing parentheses在 Repl 中使用 Clojure 而不打开右括号
【发布时间】:2020-04-15 16:21:55
【问题描述】:

我很好奇是否可以在 clojure 中编写一个可以从 repl 调用而无需打开和关闭括号的函数。例如,我总是使用以下函数:

(defn ll [] (load-file "D:\\work.clj"))

我必须用 (ll) 来调用它,但如果只需要 ll,它就会派上用场。

[我的想法来自autocad/autolisp。在那里我可以定义一个函数,如(defun c:somecommand () . . )

从这一点开始,我可以在命令行上使用一些命令(因为命令前有 'c:'。没有括号。]

【问题讨论】:

    标签: clojure


    【解决方案1】:

    你可以,但你不应该;)

    这是一个滥用 (恕我直言) reify 以覆盖 .toString 以产生副作用的示例。

    (def m (reify Object (toString [this] (println "Evil side effect") "foo")))
    #'user/m
    user=> m
    Evil side effect
    #object[user$reify__151 0x3350ebdd "foo"]
    

    【讨论】:

    • 授权,没有有用的返回值,只是副作用
    • 谢谢乔臣。我知道我在 AutoLisp 中的方式以及在某种程度上在 Clojure(两个 lisps)中的方式。但我不是专业程序员。因此,我很好奇你到底是什么意思。是否应该避免副作用并且该解决方案实际上是反作用的(作为说话的问题)?
    • 它在底层 Java 对象中滥用了 toString 方法,并且在 REPL 使用 toString 打印出有关 m 绑定的信息时意外工作。 (一般来说,Clojure 开发人员试图将具有副作用的函数保留在系统的外部边界并仅使用纯函数。也就是说,对于 REPL 中的一个小帮助工具,它可能没问题
    • 再次感谢 Jochen。我现在意识到我不想要一个函数。我想要一些工具来做某事。在这种情况下,您的 m 为我加载文件。在这个级别上,我想要一些非 Clojure 的东西。但这与无法避免 Clojure 的事实相冲突。我将很快发布另一个围绕同一问题的问题。如何防止函数返回任何内容。甚至不是零。我猜这也不是一个实用的想法。
    • 这里有另一个选择:运行你自己的 REPL!这并不难,您可以在将任何内容交给底层 REPL 之前拦截并调度命令
    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2010-12-09
    • 2016-02-05
    相关资源
    最近更新 更多