【问题标题】:Clojure REPL and workflowClojure REPL 和工作流程
【发布时间】:2015-02-24 17:55:12
【问题描述】:

来自 Haskell,我通常的工作流程是在 ghci 上 :l <file name.hs> 并使用我在那里拥有的功能和 ADT。

现在我在典型的lein new app project 上下文中使用lein repl。我在我的core.clj 旁边创建了一个testing.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)

我的意思是,肯定有比这更好的方法...:/我只想加载所有内容。另一方面,我可以使用记录实现的协议方法。

【问题讨论】:

标签: clojure leiningen


【解决方案1】:

您是否尝试过使用为创建记录而自动定义的便利功能?在本例中为(->Something 0)

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

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

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

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

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

【讨论】:

  • CompilerException java.lang.RuntimeException: Unable to resolve symbol: ->Something in this context
猜你喜欢
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多