请在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 在哪里查找 dll 文件吗?最好不用环境变量,如 CLOJURE_LOAD_PATH。实际上,它们将位于我的应用中其他 dll 文件的同一目录中(如果需要,我也可以很容易地通过编程找到这个目录)。不幸的是,既不是当前目录也不是执行程序集的目录。

顺便说一句,自动将 Clojure.dll 的位置添加到加载路径可能会解决至少我关于 clojure.core/load 的问题,并且我猜这也会非常有用。

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