Clojure REPL和工作流程

时间:2014-12-28 04:42:50

标签: clojure leiningen

来自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

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

  1. (load-file <file name>)
  2. (import 'testing.testing.Something)
  3. 我的意思是,肯定有比这更好的方法......:/我只是想加载一切。另一方面,我可以使用记录实现的协议方法。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

    (ns testing.testing)
    (defrecord Something [n])
    
  4. 从项目目录中运行lein repl
  5. 将命名空间与(use 'testing.testing :reload)
  6. 一起使用
  7. (:n (->Something 42))将创建Something的实例,并检索其n成员的值 - 在本例中为42。