#(defmacro aaa [x]
`(let [m# (atom 0)]
(fn [] ~(if x
`(reset! m# inc)
`(reset! m# dec)))))
#user> (pprint (macroexpand '(aaa true)))
(let*
[m__12183__auto__ (clojure.core/atom 0)]
(clojure.core/fn
[]
(clojure.core/reset! m__12181__auto__ clojure.core/inc)))
nil
#fn の中で最初に let で作った m# を参照することはできないですか?
#(defmacro aaa [x]
(let [m (gensym "m")]
`(let [~m (atom 0)]
(fn [] ~(if x
`(reset! ~m (inc @~m))
`(reset! ~m (dec @~m)))))))
こういうこと?
#gensymしなくていいなら
(defmacro aaa [x]
`(let [~'m (atom 0)]
(fn [] ~(if x
`(reset! ~'m (inc @~'m))
`(reset! ~'m (dec @~'m))))))
でもいいですけど
#↑のカウンタ、アトミックじゃないですけどね
#そうです!gensym したのを let で取っておくんですね。そんな技が。reset! はswap! の間違いでした。
#~'m は束縛がかぶるかもしれないから危険って奴ですよね。
#この例だったらかぶらないからいいと思いますけど
#x に m が渡された時、かぶるんじゃないですか?
#user> ((aaa false))
-1
user> (def m false)
#'user/m
user> ((aaa m))
1
#あー関係ないや。ごめんなさい。
#数日前にあった、line-seqの挙動の件ですが、
#以下のように変更されてますね。1.2-SNAPSHOT
#(when-let [line (.readLine rdr)]
(cons line (lazy-seq (line-seq rdr)))))
#echoが正常に動作するようです。
#1.1.0 のままで1.2の line-seq だけコピペって使うと、echo が最初の一行以外ちゃんと動作しないから line-seq 以外でも変更があったのかも
#ハッカソンで着手した逆引きClojure、とりあえずリリースしました! http://bit.ly/a1IiCm Clojure情報/Tipsをここに集約させましょう! #エディタが気合入ってるw
#http://wmd-editor.com/ これです > editor これのパーサーと実際のパーサー(Java)が違うのでLive Previewと実際の結果が若干異なりますw #コードの各先頭に 4つの半角スペース入れるのがコピペの時に煩雑なような気がします。
#範囲選択してエディタの101010ってやつをクリックしてください > コード
#あとコードはカッコが続いてないとlispコードとしてハイライトしてくれないので、カッコじゃないところは適当にコメントアウトしてくださいw
#clojure.test で例外が出ないことの確認ってできます?例外が出たことの確認は(is (thrown? ArithmeticException (/ 1 0))) でできるんですが。
#例外が出ずにテストケースが終了したら、例外がでなかったことになるんでは?予期せぬ例外が発生した場合はerrorsにカウントされますけど。
#あーそっか。入れておけばいいだけですね。ありがとうございます。