小编cla*_*taq的帖子

如何在Clojure中加载程序资源

如何在Clojure程序中加载程序资源,如图标,字符串,图形元素,脚本等?我使用的项目布局类似于许多Java项目中的项目布局,其中"资源"目录悬挂在"源"目录之外.从源创建一个jar文件并包含资源,但我似乎无法像在Java中那样加载资源.

我尝试的第一件事就像是

(ClassLoader/getSystemResource "resources/myscript.js")
Run Code Online (Sandbox Code Playgroud)

但永远找不到资源.

你可以做类似的事情

...
  (let [cls (.getClass net.mydomain.somenamespace)
        strm (.getResourceAsStream cls name)        ]
...
Run Code Online (Sandbox Code Playgroud)

其中name是name要加载的资源,但是流是nil.

您可以尝试使用类似的上下文类加载器

...

(let [thr (Thread/currentThread)
      ldr (.getContextClassLoader thr)
      strem (.getResourceAsStream ldr name)]
...
Run Code Online (Sandbox Code Playgroud)

strem总是零.

令人沮丧的是,我尝试将资源文件放在程序的几乎每个目录中.它们被正确地复制到jar中,但我似乎仍然无法加载它们.

我已经查看了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 { …
Run Code Online (Sandbox Code Playgroud)

java markdown resources interop clojure

28
推荐指数
2
解决办法
1万
查看次数

Clojure开发:IDE还是REPL?

我一直在使用Clojure一段时间,并希望创建一些比玩具更大更复杂的项目.我在过去的几年里一直在使用Java,并且已经习惯了IDE为我做的事情 - 编译了很多类,将它们打包在罐子里,为用户创建批处理文件以启动它们.

当我查看Clojure中的开发示例时,他们似乎是按照加载文件的方式进入REPL,看看它们是如何工作的,编辑文件,重新加载,重复.Nary在任何地方生成一个类或jar.在Stuart Halloway非常棒的"Programming Clojure"中,我找不到一个例如"gen-class"的例子.我使用的Clojure IDE(ClojureBox和enlojure NetBeans插件)似乎促进了相同的工作流程.

这是故意的吗?这些工具是不成熟还是我没有"得到它"?

我想听一些人们的工作流程示例,如果可能的话,他们创建了一些普通用户(而不是其他开发人员)使用的非平凡程序.

感谢您分享您的意见.

ide clojure read-eval-print-loop

18
推荐指数
3
解决办法
3787
查看次数

我应该使用函数或宏来验证Clojure中的参数吗?

我在Clojure中有一组数字函数,我想验证参数.函数期望有许多类型的参数,例如正整数,百分比,数字序列,非零数字序列等.我可以通过以下方式验证任何单个函数的参数:

  1. 将验证代码写入函数.
  2. 编写通用函数,将参数和期望类型传递给它.
  3. 编写通用宏,将参数和期望类型传递给它.
  4. 其他我没有想到的.

Larry Hunter的一些Lisp代码是#3的一个很好的例子.(寻找test-variables宏.)

我的直觉是宏更合适,因为对评估的控制和编译时计算的潜力,而不是在运行时完成所有操作.但是,我没有遇到我正在编写的代码似乎需要它的用例.我想知道编写这样一个宏是否值得付出努力.

有什么建议?

validation macros clojure

12
推荐指数
1
解决办法
1585
查看次数

Clojure中的惯用模式功能

我正在学习Clojure,并希望得到一些关于惯用法的建议.作为小型统计数据包的一部分,我有一个计算一组数据模式的函数.(背景:模式是一组数据中最常见的值.有几十种已发布的算法可供计算.这里使用的算法来自伯纳德罗斯纳的"生物统计学基础"第6版.)

(defn tally-map
 " Create a map where the keys are all of the unique elements in the input
   sequence and the values represent the number of times those elements
   occur. Note that the keys may not be formatted as conventional Clojure
   keys, i.e. a colon preceding a symbol."
  [aseq]
  (apply merge-with + (map (fn [x] {x 1}) aseq)))

(defn mode
 " Calculate the mode. Rosner p. 13. The mode is problematic in that it may
   not be unique and …
Run Code Online (Sandbox Code Playgroud)

statistics clojure

8
推荐指数
3
解决办法
1604
查看次数

Clojure矩阵表示

什么是Clojure中矩阵的良好表示?我对处理浮点数密集矩阵很感兴趣.脑海中浮现出"列表清单"的表现形式,但还有更好的东西吗?

良好代表性的一些标准包括:

  • 效率:它们不会用于大量数据集的持续处理,但我不想花费数小时来计算可以在几分钟内完成设计的结果.
  • Java互操作性:很容易在两种语言之间来回传递数据.
  • 易并行:如果我可以使用所有只需更换现有的核心mappmap,那将是很好的.
  • 适合使用reduce:似乎很多我正在做的计算很好reduce.
  • 能够在矩阵行中表示图像扫描线:不是很重要,但是很高兴.

有什么想法吗?

math clojure matrix linear-algebra

7
推荐指数
2
解决办法
5812
查看次数

Mathematica是否具有与Matlab的"唯一"功能相同的功能

是否有Mathematica函数提供unique()与MATLAB中的函数等效的结果?我意识到我可以使用该Union[]函数来获取列表的唯一元素,但我想要的东西等同于函数的三结果版本,它提供了在输入数组和唯一值数组之间映射的索引数组.

如果没有内置任何内容,是否可以在某处实现该功能?这里有人知道如何构建它吗?

matlab wolfram-mathematica

7
推荐指数
1
解决办法
2655
查看次数

这是封闭吗?如果是这样,为什么?

在准备另一个问题的答案时,我为自己创建了一个.考虑以下简短程序.

(ns net.dneclark.JFrameAndTimerDemo
  (:import (javax.swing JLabel JButton JPanel JFrame Timer))
  (:gen-class))

(defn timer-action [label counter]
 (proxy [java.awt.event.ActionListener] []
   (actionPerformed
     [e]
      (.setText label (str "Counter: " (swap! counter inc))))))

(defn timer-fn []
  (let [counter (atom 0)
        label (JLabel. "Counter: 0")
        timer (Timer. 1000 (timer-action label counter))
        panel (doto (JPanel.)
                (.add label))]
    (.start timer)
    (doto (JFrame. "Timer App")
      (.setContentPane panel)
      (.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
      (.setLocation 300 300)
      (.setSize 200 200)
      (.setVisible true))))

(defn -main []
  (timer-fn))
Run Code Online (Sandbox Code Playgroud)

在动作监听器'timer-action'中,'counter'参数的值被改变.实际变量在'timer-fn'函数中声明,但在侦听器中被更改.在我之前使用像Pascal这样的语言的经验中,我会认为'counter'可以通过引用传递.这是这种情况还是这个闭包的例子?别的什么?

谢谢您的帮助.

closures clojure

6
推荐指数
1
解决办法
364
查看次数

从Swing应用程序框架转换(JSR 296)

几年前,JSR 296引入了一个在Swing中创建桌面应用程序的框架.NetBeans提供了与参考实现的紧密集成.我喝了Kool-Aid(r)并创建了许多程序,从简单的单面板统计计算器到大型多窗口,多窗格数据分析和模拟程序.

JSR已经基本上被放弃了,下一版本的NetBeans(7.1)将不再包含对它的支持.我正在寻找有关如何将这组现有应用程序转换为新框架的建议.

似乎有几种可能的选择,包括:

还有其他人.

有没有人有经验从JSR 296过渡到其中一个替代方案?如果其他人之前尝试过,我真的不想完成所有这些的学习曲线.

除了移动项目之外,任何人都可以介绍他们在过渡期间维护不间断版本控制历史的经验吗?移动帮助系统怎么样?那工作得好吗?

感谢您提供的任何建议.

java swing netbeans desktop-application jsr296

6
推荐指数
1
解决办法
2663
查看次数

Compojure HTML格式

我是Clojure的新手,也是一个完整的HTML/Compojure处女.我正在尝试使用Compojure创建HTML的静态页面,使用类似于此的函数:

(defn fake-write-html
  [dir args]
  (let [file (str dir *file-separator* *index-file*)
        my-html (html
                  (doctype :html4)
                  [:html
                   [:head
                    [:title "Docs and Dirs:"]]
                   [:body
                    [:div
                     [:h2 "A nice title"]]
                    [:div
                     [:ul
                      [:li "One"]
                      [:li "Two"]]]]])]
    (clojure.contrib.duck-streams/spit file my-html)))
Run Code Online (Sandbox Code Playgroud)

该函数只是将HTML写入文件.(这里的args论点无关紧要.只是为了确保示例在我的程序中编译并运行.)

"Programming Clojure"表示对html函数的调用会生成格式化的HTML - 带缩进的多行.我得到的只是预期的doc类型,然后是一行中的所有HTML.HTML Tidy没有发现输出文件内容的任何问题.如果我println在REPL上它也会出现一条线.

是否需要其他东西才能获得格式化输出?

html clojure compojure clojure-contrib

5
推荐指数
2
解决办法
3039
查看次数

同一NetBeans项目中的Clojure和Java源代码

有没有人成功创建了一个结合了Clojure和Java源代码的NetBeans项目?

我有一些项目,其中驱动程序(启动,gui,用户首选项等)是Java,但逻辑是在Clojure中.目前,我将Clojure代码编译到一个项目中的jar中,并将其作为库导入到单独的Java项目中.如果所有源都可以组合在一个NetBeans项目中,那将会很方便.

有没有人想出办法来做到这一点?

java netbeans clojure

5
推荐指数
1
解决办法
356
查看次数

在 ClojureScript 中使用关键字访问记录字段与在 Clojure 中不同

当我尝试这个时:

(defrecord Attr [has-default default])
(def attr (->Attr true 1))
(get attr :default) ;;=> 1
(:default attr) ;;=> ClojureScript returns nil, Clojure returns 1
Run Code Online (Sandbox Code Playgroud)

使用关键字访问时的行为差异是否预期?我在 [docs][1] 中找不到关于 Clojure 和 ClojureScript 之间差异的任何内容。

更新 2020-08-04

已删除。接下来看。

更新 2020-08-06

有人指出,我之前的更新包含导致问题的拼写错误。我已经删除了更新,而不是让它成为未来读者的陷阱。

它不会改变原始观察或解决方案。



  [1]: https://www.clojurescript.org/about/differences#_data_structures
Run Code Online (Sandbox Code Playgroud)

clojure clojurescript

5
推荐指数
0
解决办法
118
查看次数

javafx-maven-plugin 版本 >= 0.0.5 时发出警告:“在 <mainClass> 中找不到模块名称。模块名称将从 module-info.java 中假定”

javafx-maven-plugin将 JavaFX 项目更新到版本 17.0.1 时,版本号为 0.0.5 或更高版本的任何版本都会发出新的警告消息。

警告消息是:

Module name not found in <mainClass>. Module name will be assumed from module-info.java
Run Code Online (Sandbox Code Playgroud)

重现步骤

在任何方便的目录中,执行以下命令来创建新的 JavaFX 项目:

mvn archetype:generate \
        -DarchetypeGroupId=org.openjfx \
        -DarchetypeArtifactId=javafx-archetype-simple \
        -DarchetypeVersion=0.0.3 \
        -DgroupId=org.openjfx \
        -DartifactId=example \
        -Dversion=1.0.0 \
        -Djavafx-version=17.0.1
Run Code Online (Sandbox Code Playgroud)

项目创建完成后,cd进入example目录并运行:

mvn clean javafx:run
Run Code Online (Sandbox Code Playgroud)

在我的系统上,会打开一个窗口并显示文本:

Hello, JavaFX 17.0.1, running on Java 17.0.1.
Run Code Online (Sandbox Code Playgroud)

这正如预期的那样。项目目录中的文件pom.xml使用0.0.3版本的插件。的相关区域pom.xml如下所示:

...
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.3</version>
                <configuration>
                    <mainClass>org.openjfx.App</mainClass>
                </configuration>
            </plugin>
...            
Run Code Online (Sandbox Code Playgroud)

更改为更新版本的插件(当前版本是0.0.8。)并重新运行程序。在我的系统上,程序仍然按预期运行,但会产生警告消息。

使用更新版本的项目原型(例如-DarchetypeVersion=0.0.6 \)会立即产生警告,因为它创建了一个使用更新插件的项目。

检查插件的来源

在https://github.com/openjfx/javafx-maven-plugin …

javafx maven-plugin maven

5
推荐指数
1
解决办法
3000
查看次数

setMnemonic为第一次出现的字符加下划线

在重新实现现有程序时,我希望保留用户熟悉的消息文本.我想添加的一个增强功能是一个很好的仅键盘界面,包括助记符.但是使用直观的助记符和现有文本会产生一些难看的结果.例如:

    useUpperCheckBox = new JCheckBox("Use UPPERCASE letters");
    useUpperCheckBox.setMnemonic(KeyEvent.VK_U);
Run Code Online (Sandbox Code Playgroud)

强调"使用"中的"U"而不是"大写"中的"U".由于用户的眼睛自然地被"大写"寻找助记符,因此装饰的默认位置有点不直观.

是的,我已经阅读了文档和教程,说明了助记符的第一个实例是下划线,但这不是我想要的.经常出现这种情况,我无法相信我是唯一一个对此感到沮丧的人.当然,比我聪明的人已经想出如何将装饰放置在与默认位置不同的地方.

java swing

3
推荐指数
1
解决办法
1228
查看次数