Как загрузить ресурсы программы в Clojure

Как Вы загружаете ресурсы программы, такие как значки, строки, графические элементы, сценарии, и так далее в программе Clojure? Я использую расположение проекта, подобное этому во многих проектах Java, где существует каталог "ресурсов", зависающий прочь "исходного" каталога. Файл банки создается из источника и включает ресурсы, но я, может казаться, не загружаю ресурсы, как я был бы в Java.

Первая вещь, которую я попробовал, была чем-то как

(ClassLoader/getSystemResource "resources/myscript.js")

Но никогда не мог находить ресурс.

Можно сделать что-то похожее с

...
  (let [cls (.getClass net.mydomain.somenamespace)
        strm (.getResourceAsStream cls name)        ]
...

где имя name из ресурса для загрузки, но поток nil.

Можно попытаться использовать загрузчик класса контекста с чем-то как

...

(let [thr (Thread/currentThread)
      ldr (.getContextClassLoader thr)
      strem (.getResourceAsStream ldr name)]
...

Но strem всегда ноль.

В разочаровании я попытался поместить файлы ресурсов в примерно каждый каталог в программе. Они копируются в банку правильно, но я все еще, может казаться, не загружаю их.

Я посмотрел на источники языка для load функционируйте и библиотека времени выполнения, но не "получаю" его.

Любая справка ценилась бы.

Править: Вот более конкретный пример. В Java, если Вы хотели преобразовать MarkDown в HTML, Вы могли бы использовать showdown.js сценарий и запись что-то как:

package scriptingtest;

import java.io.InputStreamReader;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class Example {

    private Object converter;

    public String transformMarkDown(String markdownString) {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        try {
            engine.eval(new InputStreamReader(getClass().getResourceAsStream(
                    "resources/showdown.js")));
            converter = engine.eval("new Showdown.converter()");
        } catch (Exception e) {
            return "Failed to create converter";
        }
        try {
            return ((Invocable) engine).invokeMethod(converter, "makeHtml",
                    markdownString).toString();
        } catch (Exception e) {
            return "Conversion failed";
        }
    }

    public static void main(String[] args) {
        System.out.println(new Example().transformMarkDown("plain, *emphasis*, **strong**"));
    }
}

когда я создаю проект, все это компилируется и упаковало в банку. Когда выполнено, выводы программы <p>plain, <em>emphasis</em>, <strong>strong</strong></p>

Буквальный перевод на Clojure кажется довольно простым, но я сталкиваюсь с проблемой, пытающейся создать InputStreamReader - Я, может казаться, не пишу код, должен был найти файл сценария в банке.

Править: Добавленный тег "скидки с цены" начиная с сообщения дает два полных примера подходов к обработке скидки с цены.

28
задан clartaq 15 January 2010 в 18:38
поделиться

3 ответа

Это структура каталога.

Продолжая пример пример сценариев в ОП, эквивалент Clojure будет:

(ns com.domain.example
  (:gen-class)
  (:import (java.io InputStreamReader))
  (:import (javax.script ScriptEngineManager ScriptEngine)))

(defn load-resource
  [name]
  (let [rsc-name (str "com/domain/resources/" name)
        thr (Thread/currentThread)
        ldr (.getContextClassLoader thr)]
    (.getResourceAsStream ldr rsc-name)))

(defn markdown-to-html
  [mkdn]
  (let [manager (new ScriptEngineManager)
        engine (.getEngineByName manager "js")
        is (InputStreamReader. (load-resource "showdown.js"))
        _ (.eval engine is)
        cnv-arg (str "new Showdown.converter().makeHtml(\"" mkdn "\")")]
    (.eval engine cnv-arg)))

(defn -main
  []
  (println (markdown-to-html "plain, *emphasis*, **strong**")))

обратите внимание, что путь к ресурсам COM / домен / ресурсы для этого кода, в отличие от COM / домен / Scripttestest / Resources в версии Java. В версии Clojure исходный файл, Example.clj находится в COM / Domain . В версии Java исходный файл, Example.java находится в пакете COM / Domain / Scripttestest .

При настройке проекта в My IDE NetBeans Maward проекта Java просит прилагающую пакет для источника. Плагин Clojure, Concoojure, просит пространство имен, а не пакет. Я никогда не отмечал эту разницу раньше. Отсюда ожидается ошибка «Off-On-One» в структуре каталогов.

5
ответ дан 28 November 2019 в 02:54
поделиться

Я поместил файл в TestPKG / Test.txt (относительно текущего каталога).

код:

(def x 5)
(def nm "testpkg/test.txt")
(def thr (Thread/currentThread))
(def ldr (.getContextClassLoader thr))
(def strem (.getResourceAsStream ldr nm))
(def strem2 (ClassLoader/getSystemResource nm))
(. System/out (println "First Approach:"))
(. System/out (println strem))
(. System/out (println))
(. System/out (println))
(. System/out (println "Second Approach:"))
(. System/out (println strem2))

$ Java -CP. \; Clojure.jar clojure.main test.clj

Первый подход: java.io.buffedinputstream @ 1549f94

Второй подход: Файл: / C: /jsight/javadevtools/Clojure-1.1.0/testpkg/test.txt

3
ответ дан 28 November 2019 в 02:54
поделиться

вы можете также используйте clojure.lang.RT / baseLoader

(defn serve-public-resource [path]
  (.getResourceAsStream (clojure.lang.RT/baseLoader) (str "public/" path))) 
4
ответ дан 28 November 2019 в 02:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: