1

Clojure式がプリミティブであることが保証されているかどうかを何らかの方法で検出することは可能ですか?

たとえば、これを実行できるマクロが必要です

(is-primitive-expression? (+ 1.0 2.0))
=> true

(is-primitive-expression? (+ 1N 2.0))
=> false
4

2 に答える 2

4

原始的な表現が何であるかを完全に理解しているのかわかりません(まだそれを読んでいます)。しかし、式がプリミティブであるかどうかに関する情報を返すと主張する、clojure.contrib.repl-utilscalledからの関数を見つけました。expression-info

ここを参照してください:http://clojuredocs.org/clojure_contrib/clojure.contrib.repl-utils/expression-info

ソースコードをコピーして試してみましたが、最初にこのインポートを行う必要があることがわかりました。

(import '(clojure.lang RT Compiler Compiler$C))

ただし、あなたの例で試してみましたが、両方でtrueが返されました(どちらが必要かわからなかったため、引用符で囲まれた式と引用符で囲まれていない式を試しました)。

=> (expression-info (+ 1N 2.0))
=> {:class double, :primitive? true} 
=> (expression-info (+ 1.0 2.0))
=> {:class double, :primitive? true}
=> (expression-info '(+ 1.0 2.0))
=> {:class double, :primitive? true}
=> (expression-info '(+ 1N 2.0))
=> {:class double, :primitive? true}

たぶんこれのいくつかはあなたに有用な手がかり/ヒントを提供するかもしれません、しかし私はあなたが何を求めているのか本当に理解していないのでこれは非常に役に立たないかもしれません(まだ)。

于 2012-07-30T05:47:14.020 に答える
2

フォームを反復処理し、すべてのクラスをチェックしてから、指定されたツリー内のすべてのシンボルがプリミティブ型である
ことを確認するマクロで うまくいく可能性があります。プリミティブに展開するマクロであるものをプリミティブとしてカウントするかどうかを決定する必要があります。カウントする場合は、最初に引数をマクロ展開します。

于 2012-07-30T05:26:50.380 に答える