【发布时间】:2010-11-13 03:32:53
【问题描述】:
我有一组保存在 clojure 文件中的函数。
如何提供选定的一组函数,然后将这些函数导入我的其他文件?
【问题讨论】:
我有一组保存在 clojure 文件中的函数。
如何提供选定的一组函数,然后将这些函数导入我的其他文件?
【问题讨论】:
你有几个选择。
如果它只是一个文件(不在包中),那么在您的文件中,您可以使用 load。如果您的文件名为“fun.clj”,您只需使用不带扩展名的文件名:
(load "fun")
(前提是 fun.clj 在您的类路径中)。或者
(load "files/fun")
如果它不在您的类路径中,而是在 files 目录中。
或者您可以使用 load-file 并将文件的位置传递给它:
(load-file "./files/fun.clj")
如果您想为它们命名(将它们放在一个包中),那么您可以将 ns 宏放在文件的开头,再次将它放在您的类路径中。然后您可以通过use 或require 加载它。
这里是我描述的函数的文档:
【讨论】:
除了“加载”源文件之外,您还可以使用 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 项目独立、自包含和最小化。
【讨论】:
这个解决了我的问题,我在这里查看了无数其他问题,所以我想澄清一下。
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。
【讨论】: