2024年Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面以了解更多关于这个工作方式的信息。

0
ClojureCLR

当从C#执行时

RT.load( "my.util", true );

在包含 my\util.clj 的目录中,CLOJURE_LOAD_PATH 上,我得到:

System.IO.FileNotFoundException: 无法定位 my.util.clj.dll 或我的.util.clj 在加载路径上。

我认为后者是错误的 - 它应该在加载路径上查找 my\util.clj?

此外,还存在着一个问题,即命名空间中包含-的编译程序集存在问题。例如,如果我有编译的命名空间 myns.foo-bar (在文件 myns\foo_bar.clj 中),它产生 myns.foo_bar.clj.dll。如果试着像这样加载它:

RT.load( "myns.foo-bar", true );

System.IO.FileNotFoundException: 无法定位 myns.foo-bar.clj.dll 或 myns.foo-bar.clj 在加载路径上。

我认为 RT.load 应“知道”编译包含-字符的命名空间映射到相应的 dll 或源文件名中的 _。

5 个答案

0

评论由:dmiller 发表

不应该直接调用 RT.load。大多数 RT 命名空间中的函数都不是 C1. 代码的 Clojure 交互。

对于 RT.load 的特殊情况,它在内部只调用一次,在系统初始化期间加载 clojure/core。

而不是直接调用,请使用新的交互功能从 C1. 调用 Clojure 函数。
Clojure.var 方法实际上是 clojure.clr.api.Clojure.var

IFn load= Clojure.var("clojure.core", "+");
load.invoke("my.util");

看这对你是否有效。

0

评论由:akaranta 发表

哦,好的,我以为 RT 的方法是一个公共API,我认为我从某个示例中得到了这个用法,它似乎有效。大多数情况下都有效。

我目前使用 Clojure-CLR 1.5.0,但似乎找不到 class clojure.clr.api.Clojure。我猜它在 1.6.0 中加入了吗?在 1.5.0 中推荐如何加载名字空间 / 变量呢?

0
by

评论由:dmiller 发表

这个类确实是在 1.6.0 中新加入的。在 1.5.0 中,你可以做到与 clojure.clr.api 相同的事情。

    private static Symbol asSym(object o)
    {
        String str = o as String;
        Symbol s = str != null ? Symbol.intern(str) : (Symbol)o;
        return s;
    }

    public static IFn var(object qualifiedName)
    {
        Symbol s = asSym(qualifiedName);
        return var(s.Namespace, s.Name);
    }
    public static IFn var(object ns, object name)
    {
        return Var.intern(asSym(ns), asSym(name));
    }

如果给你两个字符串,一个用于名字空间,一个用于名字,这将简化为

Var x = clojure.lang.Var.intern(ns,name);
0
by

评论由:akaranta 发表

由于某种原因,clojure.core/load 似乎找不到给定的名字空间(即相应的.dll),而 RT.load 则能找到。

我是否需要做一些额外的工作来告诉 clojure.core/load 哪里可以找到 dll 文件?最好不涉及环境变量,如 CLOJURE_LOAD_PATH。实际上,它们会与我的应用程序中的其他 dll 文件位于同一目录下(并且如果需要,我可以很容易地编程找到这一点)。不幸的是,它既不是当前目录也不是执行程序的目录。

顺便说一下,自动将 Clojure.dll 的位置添加到加载路径很可能至少解决我遇到的问题,我猜这也会很通用。

0
by
参考:[https://clojure.atlassian.net/browse/CLJCLR-32](https://clojure.atlassian.net/browse/CLJCLR-32)(由 alex+import 报告)
...