来自Haskell,我通常的工作流程将是:l <file name.hs>
在ghci上,并使用我在那里的函数和ADT。
现在我在典型的lein repl
上下文中使用lein new app project
。我在testing.clj
旁边创建了一个core.clj
文件。在那里,我定义了几个函数,一个协议和一个实现协议的记录。我能够通过(use 'testing.testing :reload)
使用该功能,问题是我无法使用实际记录:
(def c (Something. 0))
我明白了:
CompilerException java.lang.IllegalArgumentException: Unable to resolve classname: Something
那么,在这种情况下,“更好”的工作流程是什么?哪里我不想直接在REPL上设置函数,协议,记录,而且我也不想依赖我的core.cls文件?我只想要一个文件,在那里我可以抛弃一堆东西并玩它。
PS:我的环境是Mac OSX Terminal + Sublime
编辑几分钟后,我可以通过以下方式加载记录:
(load-file <file name>)
(import 'testing.testing.Something)
我的意思是,肯定有比这更好的方法......:/我只是想加载一切。另一方面,我可以使用记录实现的协议方法。
答案 0 :(得分:1)
您是否尝试过使用自动定义的便利功能来创建记录?在此示例中,它将是(->Something 0)
。
(Something. 0)
正在使用Java构造函数,它需要单独导入Java类。当您定义记录以允许Java与您在Clojure中定义的内容互操作时,会自动创建Java类。
使用(->Something 0)
语法是正确的方法,应该可以在(use 'testing.testing :reload)
之后使用。
编辑鉴于以上似乎没有帮助,这里有一些逐步说明,以获得最小的工作示例
testing
lein new app testing
在testing/src/testing
中,您创建包含以下两行的testing.clj
(ns testing.testing)
(defrecord Something [n])
lein repl
(use 'testing.testing :reload)
(:n (->Something 42))
将创建Something
的实例,并检索其n
成员的值 - 在本例中为42。