请在 2024 年 Clojure 状况调查! 中分享您的想法。

欢迎!有关如何使用本站的更多信息,请参阅 关于 页面。

0
ClojureCLR

当从 C# 其中执行操作时

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

并且目录包含 CLOJURE_LOAD_PATH 上的 my\util.clj,我得到

System.IO.FileNotFoundException: 无法在加载路径上找到 my.util.clj.dll 或 my.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,类clojure.clr.api.Clojure似乎不存在。我猜这是1.6.0中新加入的?1.5.0推荐如何加载命名空间/变量呢?

0

评论者:dmiller

这个类确实是在1.6.0中加入的。在1.50中,你可以做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

评论人:akaranta

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

是否需要执行一些额外的步骤来告诉clojure.core/load在哪里查找dll文件?最好是不要用像CLOJURE_LOAD_PATH这样的环境变量。在实际情况中,它们将在我应用程序中的其他dll的同目录下(如果需要,我可以轻松地通过编程找到这一点)。不幸的是,既不是当前目录,也不是执行程序的目录。

顺便说一句,自动将Clojure.dll的位置添加到加载路径可能至少解决我的clojure.core/load问题,我猜测这对一般用途也是有用的。

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