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

欢迎!请参阅 关于 页面以了解有关如何使用网站的更多信息。

0
ClojureCLR

当从 C# 进行操作时

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

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

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在哪里查找dlls?最好的情况是不涉及环境变量,如CLOJURE_LOAD_PATH。在实践中,它们将位于我应用程序中其他dlls的同一目录中(如果需要,我可以轻松地编程找出该位置)。不幸的是,它既不是当前目录也不是执行程序集的目录。

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

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