【问题标题】:How do I require and provide clojure files?我如何要求和提供 clojure 文件?
【发布时间】:2010-11-13 03:32:53
【问题描述】:

我有一组保存在 clojure 文件中的函数。

如何提供选定的一组函数,然后将这些函数导入我的其他文件?

【问题讨论】:

    标签: file import clojure


    【解决方案1】:

    你有几个选择。

    如果它只是一个文件(不在包中),那么在您的文件中,您可以使用 load。如果您的文件名为“fun.clj”,您只需使用不带扩展名的文件名:

     (load "fun")
    

    (前提是 fun.clj 在您的类路径中)。或者

     (load "files/fun") 
    

    如果它不在您的类路径中,而是在 files 目录中。

    或者您可以使用 load-file 并将文件的位置传递给它:

    (load-file "./files/fun.clj")
    

    如果您想为它们命名(将它们放在一个包中),那么您可以将 ns 宏放在文件的开头,再次将它放在您的类路径中。然后您可以通过userequire 加载它。

    这里是我描述的函数的文档:

    【讨论】:

    • 很抱歉,我还是有一些问题。我有一个名为 stopwords.clj 和 Autotag.clj 的文件。我想将停用词导入 Autotag。当我输入(加载“停用词”)时,它显示“无法在类路径上找到停用词__init.class 或 stopwords.clj:”,即使我在同一文件夹中有停用词和 Autotag。我很抱歉,但我是一个完整的新手。请帮帮我。
    • 当前目录可能不在您的类路径中,因此 clojure 无法“看到”它。将 stopwords.clj 放在您的类路径中的某个位置(或更改您的类路径以包含“.”)。
    • 对不起,不知道。这里是emacs用户。
    • 谢谢你,赛斯。我已经敲了一个小时想弄清楚这一点(不感谢 PragProg 的书,这绝不是务实的)
    【解决方案2】:

    除了“加载”源文件之外,您还可以使用 leiningen 的“检查依赖项”功能。例如,如果您有两个 leiningen 项目,项目 A 需要 B(提供者)。在项目 A 的根目录中,创建一个名为“checkouts”的目录。在 "/checkouts" 中创建一个指向项目 B 根目录的符号链接。

    - project A
      - project.clj
      - checkouts
        - symlink to project B
      - src
      - test
    

    在项目 A 的 project.clj 中,将项目 B 声明为 :dependencies 部分中的依赖项,就像它是 clojars.org 中的项目一样。例如

    (defproject project-a
    :dependencies [[org.clojure/clojure "1.5.1"]
                   [project-b "0.1.0"]])
    

    问题是,你必须进入项目 B 并输入:

    lein install
    

    这会将项目 B 的文件编译成一个 jar 文件,该文件将出现在你的 ~/.m2 目录中,这有点像你本地的 clojars.org 缓存。

    设置完所有这些后,在项目 A 的 *.clj src 文件中,您可以以正常方式“要求”项目 B 文件,就好像它来自 clojars.org:

    (ns project-a.core
      (:require [project-b.core :as pb])
    

    这样,你可以像这样引用你的 project-b.core 中的函数:

    pb/myfunction1
    

    在我看来,这是一种在 Leiningen 项目之间共享库和数据的好方法,同时尽量保持每个 Leiningen 项目独立、自包含和最小化。

    【讨论】:

      【解决方案3】:

      这个解决了我的问题,我在这里查看了无数其他问题,所以我想澄清一下。

      emacs(在 linux 上)中最简单的方法是执行以下操作:

      java -cp "lib/*":. clojure.main -e "(do (require 'swank.swank) (swank.swank/start-repl))"
      

      (注意 "lib/*":. 给 -cp

      然后你可以使用 M-x slime-connect 来连接这个实例。

      不知道是否需要,但我读过在双方都使用相同版本的 clojure、clojure-contrib 和 swank-clojure 是个好主意。

      您还可以通过使用“.”来设置 emacs 中的路径。到 swank-clojure-classpath。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-09
        • 2018-05-22
        • 1970-01-01
        • 2019-09-14
        • 1970-01-01
        • 2013-12-14
        • 1970-01-01
        相关资源
        最近更新 更多