关于leiningen:Clojure REPL和工作流程

Clojure REPL and workflow

来自Haskell,我通常的工作流程是在ghci上转到:l 并使用我在那里的功能和ADT。

现在,我在典型的lein new app project上下文中使用lein repl。我在core.clj旁边创建了testing.clj文件。我在那里定义了两个功能,一个协议和一个实现该协议的记录。我可以通过(use 'testing.testing :reload)使用该功能,但问题是我无法使用实际记录:

1
(def c (Something. 0))

我得到:

1
CompilerException java.lang.IllegalArgumentException: Unable to resolve classname: Something

那么,在这种情况下,"更好"的工作流程是什么?在我不想直接在REPL上设置功能,协议,记录的地方,但是我也不想依赖我的core.cls文件?我只想要一个文件,我可以在其中转储一堆东西并使用它。

PS:我的环境是Mac OSX Terminal + Sublime

编辑:几分钟后,我可以通过以下方式加载记录:

  • (load-file )
  • (import 'testing.testing.Something)
  • 我的意思是,肯定有比这更好的方法...:/我只想加载所有内容。另一方面,我能够使用记录实现的协议方法。


    您是否尝试过使用为创建记录自动定义的便捷功能? 在此示例中,该值为(->Something 0)

    (Something. 0)使用的是Java构造函数,该构造函数需要单独导入Java类。 当您定义记录以允许Java与您在Clojure中定义的内容互操作时,会自动创建Java类。

    使用(->Something 0)语法是正确的方法,并且在(use 'testing.testing :reload)之后应该可以使用。

    编辑鉴于上述似乎没有帮助,这里是一些逐步说明,以获取一个最小的工作示例

  • 您有一个使用lein new app testing创建的应用目录testing
  • testing/src/testing中,创建包含以下两行的testing.clj

    1
    2
    (ns testing.testing)
    (defrecord Something [n])

  • 从项目目录中运行lein repl
  • 将名称空间与(use 'testing.testing :reload)一起使用
  • (:n (->Something 42))将创建Something的实例并检索其n成员的值-在这种情况下为42。