3

その有効な clojure 形式を考慮すると、次のようになります。

    > (let [a 16 b 8] (/ a b))
2

呼び出しにフィードするために、手動で構築しようとしていevalます。私はかなり前にreplに拒否されました:

> (list 'let '[ 'a '16 'b '8 '] '(/ a b) )
RuntimeException Unmatched delimiter: ]  clojure.lang.Util.runtimeException (Util.java:156)
(/ a b)
RuntimeException Unmatched delimiter: )  clojure.lang.Util.runtimeException (Util.java:156)

配列文字を引用する[]だけでは不十分です。実際、次の式 ([ と ] を削除) は問題ありません。

> (list 'let  'a '16 'b '8  '(/ a b) )
(let a 16 b 8 (/ a b))

その構造の何が問題になっていますか?そして、どうすれば回避できますか?[ と ] 文字を引用する特別な形式はありますか?

4

3 に答える 3

5

コードを生成しようとしている場合は、以下のように auto-gensyms を使用してこの式を作成することをお勧めします。

`(let [a# 16 b# 8] (/ a# b#))

auto-gensyms (a#およびb#) は、一意であることが保証されているシンボル名を作成します。これは厳密には必要ではありませんが、より複雑なケースでは、変数名が誤ってキャプチャされるのを防ぐのに役立ちます (たとえば、さまざまなレベルのマクロ展開によって)。

式の先頭で、通常の引用符 (') ではなく構文引用符 (`) を使用していることに注意してください。名前空間が自動的に処理されるため、通常、コードを生成するときは通常の引用符よりも優れています

于 2012-09-17T04:47:05.377 に答える
4

リスト全体を引用することもできます。

main=> (def bar '(let [a 16 b 8] (/ a b)))
#'main/bar
main=> bar
(let [a 16 b 8] (/ a b))
main=> (eval bar)
2

またはこのように...

main=> (def bar (quote (let [a 16 b 8] (/ a b))))
#'main/bar
main=> bar
(let [a 16 b 8] (/ a b))
main=> (eval bar)
2
于 2012-09-16T23:04:28.090 に答える
4

ベクトル全体を引用できます。

(list 'let '[a 16 b 8] '(/ a b))
于 2012-09-16T22:23:53.963 に答える