Подтвердить что ты не робот

Как мне потребовать и предоставить файлы clojure?

У меня есть набор функций, сохраненных в .clj.

Как предоставить выбранный набор функций, а затем импортировать эти функции в другой файл?

4b9b3361

Ответ 1

У вас есть несколько вариантов.

Если это просто файл (не в пакете), то в ваших файлах вы можете просто использовать load. Если ваш файл был назван "fun.clj", вы просто должны использовать имя файла без расширения:

 (load "fun")

(при условии, что fun.clj был в вашем пути к классу). Или

 (load "files/fun") 

если он не был в вашем пути к классам, а в каталоге files.

Или вы можете использовать load-file и передать ему местоположение вашего файла:

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

Если вы хотите, чтобы их пространство имен (помещало их в пакет), тогда youd помещал макрос ns в начало вашего файла, снова помещал его в свой путь к классам. Затем вы можете загрузить его через use или require.

Вот документы для описываемых функций:

Ответ 2

Помимо "загружаемых" исходных файлов, вы также можете использовать функцию "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 как самостоятельный, автономный и минимальный, насколько это возможно.

Ответ 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.