Clojure REPL and workflow
来自Haskell,我通常的工作流程是在ghci上转到:l 并使用我在那里的功能和ADT。
现在,我在典型的lein new app project上下文中使用lein repl。我在core.clj旁边创建了testing.clj文件。我在那里定义了两个功能,一个协议和一个实现该协议的记录。我可以通过(use 'testing.testing :reload)使用该功能,但问题是我无法使用实际记录:
我得到:
1
| CompilerException java.lang.IllegalArgumentException: Unable to resolve classname: Something |
那么,在这种情况下,"更好"的工作流程是什么?在我不想直接在REPL上设置功能,协议,记录的地方,但是我也不想依赖我的core.cls文件?我只想要一个文件,我可以在其中转储一堆东西并使用它。
PS:我的环境是Mac OSX Terminal + Sublime
编辑:几分钟后,我可以通过以下方式加载记录:
(load-file )
(import 'testing.testing.Something)
我的意思是,肯定有比这更好的方法...:/我只想加载所有内容。另一方面,我能够使用记录实现的协议方法。
-
您要load-file吗? clojuredocs.org/clojure.core/load-file
-
@Kevin添加了编辑。
您是否尝试过使用为创建记录自动定义的便捷功能? 在此示例中,该值为(->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。
-
CompilerException java.lang.RuntimeException: Unable to resolve symbol: ->Something in this context