У меня есть набор функций, сохраненных в .clj.
Как предоставить выбранный набор функций, а затем импортировать эти функции в другой файл?
У меня есть набор функций, сохраненных в .clj.
Как предоставить выбранный набор функций, а затем импортировать эти функции в другой файл?
У вас есть несколько вариантов.
Если это просто файл (не в пакете), то в ваших файлах вы можете просто использовать load
. Если ваш файл был назван "fun.clj", вы просто должны использовать имя файла без расширения:
(load "fun")
(при условии, что fun.clj
был в вашем пути к классу). Или
(load "files/fun")
если он не был в вашем пути к классам, а в каталоге files
.
Или вы можете использовать load-file
и передать ему местоположение вашего файла:
(load-file "./files/fun.clj")
Если вы хотите, чтобы их пространство имен (помещало их в пакет), тогда youd помещал макрос ns
в начало вашего файла, снова помещал его в свой путь к классам. Затем вы можете загрузить его через use
или require
.
Вот документы для описываемых функций:
Помимо "загружаемых" исходных файлов, вы также можете использовать функцию "checkout dependencies" leiningen. Если у вас есть два проекта leiningen, скажем, для проекта A требуется B (поставщик). В корневом каталоге проекта A создайте каталог с названием "checkouts". Внутри "/checkouts" сделать символическую ссылку на корневую директорию проекта B.
- project A
- project.clj
- checkouts
- symlink to project B
- src
- test
в проекте A project.clj объявить проект B как зависимость в разделе зависимостей, как если бы это был проект в 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.
Как только вы установите все это, в *.clj файлах src проекта A, вы можете "потребовать" файлы проекта B обычным способом, как если бы это было из clojars.org:
(ns project-a.core
(:require [project-b.core :as pb])
Таким образом, вы можете ссылаться на функции в вашем проекте-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.