无法设置CLOJURE_LOAD_PATH;从运行时获取TypeInitializationError

时间:2012-01-05 14:40:26

标签: clojure clojureclr

我试图在CLR上运行Clojure并陷入一些基本问题。基于this question我使用以下代码:

在program.clj中:

(ns program
  (:require [clojure.core])
  (:gen-class
   :methods [#^{:static true} [output [int int] int]]))

(defn output [a b]
  (+ a b))

(defn -output [a b]
  (output a b))

(defn -main []
  (println (str "(+ 5 10): " (output 5 10))))

然后在Program.cs中:

using System;
using clojure.lang;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            program p = new program();
            System.Console.WriteLine(p.output(5, 9));
            System.Console.ReadLine();
        }
    }
}

当我运行Program.cs时,它会抛出一个带有错误消息&#34的TypeInitializationError;无法在加载路径上找到clojure / core.clj.dll或clojure / core.clj。"为了调试,我添加了以下行:

System.Environment.SetEnvironmentVariable("clojure.load.path", "c:\clojure");
System.Console.WriteLine(System.Environment.GetEnvironmentVariable("clojure.load.path"));
System.Console.WriteLine(RT.CLOJURE_LOAD_PATH);

第一个WriteLine显示" c:\ clojure",正如我所料。第二个显示" clojure.load.path"。我的理解是运行时查看了加载路径的环境变量。那么为什么没找到呢?如何设置加载路径?

2 个答案:

答案 0 :(得分:2)

丹,

您需要在项目中包含以下与clojureclr相关的dll:

`Clojure.dll,
clojure.clr.io.clj.dll,
clojure.core.clj.dll,
clojure.core.protocols.clj.dll,
clojure.core_clr.clj.dll,
clojure.core_deftype.clj.dll,
clojure.core_print.clj.dll,
clojure.core_proxy.clj.dll,
clojure.genclass.clj.dll,
clojure.gvec.clj.dll`

一旦你拥有那些你将组装的程序集,你将能够运行baseball.exe。如果你还没有我,你可以查看这篇博文:http://www.myclojureadventure.com/2011/12/intro-to-clojure-clr-calling-clojure.html我遇到了你之前遇到的同样问题,这就是刺激帖子的原因。

答案 1 :(得分:0)

我对Clojure / CLR了解不多,但我不认为在加载Clojure运行时之后更改环境变量会改变Clojure加载路径。它肯定不像Clojure / JVM那样工作 - 这些环境变量 - >系统设置显然是在主代码加载后修复的。在Clojure / JVM中,这通常意味着您从另一个已经为您设置加载路径的主要clojure进程启动(通常是直接启动JVM或leiningen / cake调用的批处理脚本)。