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

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

0
参考:[https://clojure.atlassian.net/browse/CLJCLR-32](https://clojure.atlassian.net/browse/CLJCLR-32) 由直接导入报告
...