2

CLRでClojureを実行しようとしていますが、いくつかの基本的な問題で立ち往生しています。この質問に基づいて、次のコードを使用しています。

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 を実行すると、「ロード パスに clojure/core.clj.dll または clojure/core.clj が見つかりませんでした」というエラー メッセージとともに TypeInitializationError がスローされます。デバッグするために、次の行を追加しました。

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」が表示されます。2 つ目は「clojure.load.path」を示しています。私の理解では、ランタイムはロード パスの環境変数を参照していました。では、なぜ見つからないのでしょうか。他にどのようにロード パスを設定しますか?

4

2 に答える 2

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その前に持っていることが、投稿に拍車をかけたものです。

于 2012-01-05T21:07:41.813 に答える
0

Clojure/CLR についてはよくわかりませんが、Clojure ランタイムをロードしたに環境変数を変更すると、Clojure ロード パスが変更されるとは思いません。Clojure/JVM ではそのようには機能しません。これらの種類の環境 var -> システム設定は、メイン コードが読み込まれると修正されるように意図されているようです。Clojure/JVM では、これは通常、ロード パスが既に設定されている別のプロセスからメインの clojure プロセスを起動することを意味します (通常、JVM を直接起動するバッチ スクリプトまたは leiningen/cake 呼び出し)。

于 2012-01-05T20:21:08.793 に答える