#clojure
#clojure
Вопрос:
Сначала я должен сказать, что я совершенно новичок в clojure, поэтому простите меня, если я упускаю что-то очевидное. Недавно я установил пакет clojure в текстовом редакторе atom для создания некоторых графиков и попытался добавить ubergraph, расширение, которое делает возможными взвешенные графики, поскольку они не поддерживаются в стандартном пакете clojure.
Я следовал руководству по быстрому запуску на ubergraphs github https://github.com/Engelberg/ubergraph и удалось выполнить первый шаг (добавление ubergraph к зависимостям leiningen). Я загрузил репозиторий git и не знаю, как продолжить отсюда. Запуск примера кода
(ns example.core
(:require [ubergraph.core :as uber]))
(def graph1
(uber/graph [:a :b] [:a :c] [:b :d]))
в repl, как описано на github, появляется следующая ошибка:
Исключение компилятора java.lang.Исключение NullPointerException, компиляция: (ubergraph/core.clj:11:1)
Строка, которая, по-видимому, вызывает ошибку в core.clj, является:
(import-vars
[...])
Я пропустил переменные, так как не думаю, что они вызывают проблему.
Clojure работает на правильной версии (1.9.0) и установлена java 8. Помощь приветствуется, заранее спасибо.
Комментарии:
1. Я только что установил библиотеку, создал новое пространство имен, вставил приведенный выше код, и это сработало. Для меня это работает как для 1.9.0, так и для 1.10.0. Попробуйте запустить
lein clean
.2. Попробовал, не сработало. По-прежнему возвращает ту же ошибку. Не могли бы вы опубликовать код, который вы использовали для создания пространства имен? Кроме того, нужно ли мне размещать библиотеку где-то конкретно? Возможно, я делаю что-то не так. Спасибо.
3. Я также попытался запустить его 1.10.0 и получил практически то же самое:
(ns example.core (:require [ubergraph.core :as uber])) Unexpected error (NullPointerException) macroexpanding potemkin.namespaces/import-def at (core.clj:11:1)
4.
Running the example code on the repl
— какую команду вы используете?5. Это описано прямо ниже, тот, который пытается создать пространство имен.
Ответ №1:
Основываясь на вашем комментарии «Кроме того, должен ли я поместить библиотеку где-то конкретно?», Это, похоже, вызвано непониманием того, как установить библиотеку. Вам не следует вручную разбираться с подобными вещами; лейнинген обрабатывает установку библиотеки за вас.
Вот краткое руководство, которое предполагает, что вы еще не создали проект. Если у вас есть, перейдите к шагу 2.
-
Запустите
lein new app you-project-name-here
. Это создаст базовый проект сproject.clj
базовой файловой структурой. Если вы используете IDE, такую как IntelliJ Cursive, при создании нового проекта этот шаг будет выполнен автоматически. -
Зайдите в свой
project.clj
и добавьте[ubergraph "0.5.2"]
в:dependencies
запись. В качестве минимального, сокращенного примера это должно выглядеть примерно так:(defproject example "0.1.0-SNAPSHOT" :dependencies [[org.clojure/clojure "1.10.0"] [ubergraph "0.5.2"]] :main example.core) ; The path to your core
-
Имейте
core
что-то вроде:(ns example.core (:require [ubergraph.core :as uber]) (:gen-class)) (def graph1 (uber/graph [:a :b] [:a :c] [:b :d])) (defn -main "I don't do a whole lot ... yet." [amp; args] (println "The graph:" graph1))
-
Теперь запустите
lein run
. Вы должны увидеть, как он загружает зависимости, а затем печатает что-то вроде этого беспорядка:The graph: {:node-map {:a #ubergraph.core.NodeInfo{:out-edges {:b #{#ubergraph.core.UndirectedEdge{:id #uuid "0768ef5b-1507-4bb0-b3da-fc14a84d013d", :src :a, :dest :b, :mirror? false}}, :c #{#ubergraph.core.UndirectedEdge{:id #uuid "acddd770-52cc-4b1f-aec1-762861e70ee2", :src :a, :dest :c, :mirror? false}}}, :in-edges {:b #{#ubergraph.core.UndirectedEdge{:id #uuid "0768ef5b-1507-4bb0-b3da-fc14a84d013d", :src :b, :dest :a, :mirror? true}}, :c #{#ubergraph.core.UndirectedEdge{:id #uuid "acddd770-52cc-4b1f-aec1-762861e70ee2", :src :c, :dest :a, :mirror? true}}}, :out-degree 2, :in-degree 2}, :b #ubergraph.core.NodeInfo{:out-edges {:a #{#ubergraph.core.UndirectedEdge{:id #uuid "0768ef5b-1507-4bb0-b3da-fc14a84d013d", :src :b, :dest :a, :mirror? true}}, :d #{#ubergraph.core.UndirectedEdge{:id #uuid "ef931d4e-8143-4cd1-8a10-c3692c47072f", :src :b, :dest :d, :mirror? false}}}, :in-edges {:a #{#ubergraph.core.UndirectedEdge{:id #uuid "0768ef5b-1507-4bb0-b3da-fc14a84d013d", :src :a, :dest :b, :mirror? false}}, :d #{#ubergraph.core.UndirectedEdge{:id #uuid "ef931d4e-8143-4cd1-8a10-c3692c47072f", :src :d, :dest :b, :mirror? true}}}, :out-degree 2, :in-degree 2}, :c #ubergraph.core.NodeInfo{:out-edges {:a #{#ubergraph.core.UndirectedEdge{:id #uuid "acddd770-52cc-4b1f-aec1-762861e70ee2", :src :c, :dest :a, :mirror? true}}}, :in-edges {:a #{#ubergraph.core.UndirectedEdge{:id #uuid "acddd770-52cc-4b1f-aec1-762861e70ee2", :src :a, :dest :c, :mirror? false}}}, :out-degree 1, :in-degree 1}, :d #ubergraph.core.NodeInfo{:out-edges {:b #{#ubergraph.core.UndirectedEdge{:id #uuid "ef931d4e-8143-4cd1-8a10-c3692c47072f", :src :d, :dest :b, :mirror? true}}}, :in-edges {:b #{#ubergraph.core.UndirectedEdge{:id #uuid "ef931d4e-8143-4cd1-8a10-c3692c47072f", :src :b, :dest :d, :mirror? false}}}, :out-degree 1, :in-degree 1}}, :allow-parallel? false, :undirected? true, :attrs {}, :cached-hash #object[clojure.lang.Atom 0x16da1abc {:status :ready, :val -1}]}
Я подозреваю, что NPE был вызван тем, что вы каким-то образом установили ubergraph, но не позволили ему автоматически разрешать свои зависимости. Когда он попытался запустить import-vals
, одна из библиотек, от которых он зависит, не была найдена, и это вызвало сбой.
Комментарии:
1. Я сделал, как вы предложили, но, к сожалению, я все еще сталкиваюсь с NPE в том же самом месте.
but didn't allow it to automatically resolve its dependencies
У вас есть идея о том, как это решить? Но спасибо за упрощенное руководство, это уже помогло мне стать лучше в clojure.2. @heathcliff Попробуйте запустить
lein clean
или вручную удалить файлы, которые вы установили ранее вручную, а затем попробуйте то, что я написал снова. Он может не пытаться устранить несоответствия, если увидит, что у вас уже есть ubergraph.3. Хорошо, я переустановил все , и это сработало! NPE исчез, и lein вернул график в виде кода. Спасибо за вашу помощь на этом этапе. Теперь, для последней части, я хочу, чтобы proto-repl возвращал сгенерированный график. Но после запуска нового проекта в repl он просто ничего не возвращает, хотя он работает в терминале, как описано выше.
4. Вы хотите сказать, что ввод
(uber/graph [:a :b] [:a :c] [:b :d]))
в REPL ничего не делает? И я никогда не использовал Proto-repl, поэтому, возможно, в этом есть какая-то особенность, о которой я не знаю.5. Ввод,
(uber/pprint graph1)
как указано на github, возвращаетSyntax error compiling at (form-init3482870938599296850.clj:1:1). No such namespace: uber
core.clj, похоже, не загружается.