Как успешно установить ubergraph

#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.

  1. Запустите lein new app you-project-name-here . Это создаст базовый проект с project.clj базовой файловой структурой. Если вы используете IDE, такую как IntelliJ Cursive, при создании нового проекта этот шаг будет выполнен автоматически.

  2. Зайдите в свой 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
      
  3. Имейте 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))
      
  4. Теперь запустите 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, похоже, не загружается.