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吗?

此外,名字空间包含-'s的编译程序集也存在问题。例如,如果我有编译名字空间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报告)
...