2

現在、私はClojureに異なる言語(Shen)を実装しています。./ in Clojure(修飾シンボル?)

Shenには記号「./」がありますが、Clojureではこれが評価前に解釈され、エラーが発生します。 私はClojureコードのためにこの関数をコンパイルしているマクロの中に "./"は必要ありません。

これを無視する方法はありますか? これは、修飾されたシンボルとして解釈されると思いますが、名前のない場合は、/またはxyz /で置き換えると同じエラーメッセージが表示されるためです。

私は次のことが起こるシェンコードでそれを呼び出したときに私の現在のマクロは

(defmacro kl/trap-error [x [y z r]] `(try ~x (catch Exception '~z ~r))) 

のと同じくらい簡単です。しかし:

kl=> (trap-error (/ 1 0) (./ E (error-to-string E) 
RuntimeException Invalid token: ./ clojure.lang.Util.runtimeException (Util.java:156) 
CompilerException java.lang.RuntimeException: Unable to resolve symbol: E in this context, compiling:(NO_SOURCE_PATH:0) 
CompilerException java.lang.RuntimeException: Unable to resolve symbol: E in this context, compiling:(NO_SOURCE_PATH:89) 

私は、誰かがこれで私を助けることができると思います。

ありがとうございます。

+1

CLでは| ./ |を使用できますが、Clojureで動作するかどうかわかりません。 – Daimrod

+1

私が知る限り、Clojureでこれを行うにはカスタムリーダーが必要ですが、わかりません。 – danlei

+0

@ダンリー:しかし、私が知っている限り、Clojureは読者のマクロを定義する標準的な方法がないので、あなたは[ちょっとハックする]必要があります(http://briancarper.net/blog/449/clojure-reader-macros )それは本当に感謝していない。 – Daimrod

答えて

2

これは、Clojureリーダー(Clojureプログラマーには与えられていない特権)を変更しなければ不可能です。あなたのステートメント "シェンは記号./を持っていますが、これは評価の前に解釈され、したがってエラーになります"とは間違っていますが、読者はこれらの文字を見て、どのデータ型にすべきか

  • リストには含まれていますか?いいえ、いいえ。
  • 文字列ですか?いいえ、引用符はありません。
  • シンボルですか?いいえ、名前空間はありますが、名前はありません。
  • ...これ以上の多くのケース...
  • これは、有効なClojureコードを表すデータ構造ではありません。
+0

Clojure REPLでShenコードを書くことはできません。たとえば、ファイルを読み込み、「./」を置き換えるだけで、文字列を読む... –

+0

まあ。 clojure.main/replを使用すると、組み込み関数の代わりに読み込みに使用する関数を指定できます。ですから、replに書き込む特定の場合は、ちょっとした作業でうまくいくでしょう。しかし、ファイルの要求にはそのようなフックがないので、一般的なケースでは何もできないと思います。 – amalloy

+0

ありがとうございます。私はこれを読むことができる "シェンREPL"を書くことを試みるかもしれません。今のところ私はShenファイルを読んで、/を置き換えます。評価前のラムダ。 –