Clojure > Archives > 2010/04/25

2010/04/25 08:47:31 UTCfatrow
#
(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# を参照することはできないですか?
2010/04/25 09:07:29 UTCmaking
#
(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))))))
でもいいですけど
#
↑のカウンタ、アトミックじゃないですけどね
2010/04/25 09:13:08 UTCfatrow
#
そうです!gensym したのを let で取っておくんですね。そんな技が。reset! はswap! の間違いでした。
#
~'m は束縛がかぶるかもしれないから危険って奴ですよね。
2010/04/25 09:17:43 UTCmaking
#
この例だったらかぶらないからいいと思いますけど
2010/04/25 09:33:37 UTCfatrow
#
x に m が渡された時、かぶるんじゃないですか?
#
user> ((aaa false))
-1
user> (def m false)
#'user/m
user> ((aaa m))
1
#
あー関係ないや。ごめんなさい。
2010/04/25 10:32:52 UTCtnoborio
#
数日前にあった、line-seqの挙動の件ですが、
#
以下のように変更されてますね。1.2-SNAPSHOT
#
(when-let [line (.readLine rdr)]
    (cons line (lazy-seq (line-seq rdr)))))
#
echoが正常に動作するようです。
2010/04/25 11:23:30 UTCfatrow
#
1.1.0 のままで1.2の line-seq だけコピペって使うと、echo が最初の一行以外ちゃんと動作しないから line-seq 以外でも変更があったのかも
2010/04/25 13:30:15 UTCmaking
#
ハッカソンで着手した逆引きClojure、とりあえずリリースしました! http://bit.ly/a1IiCm Clojure情報/Tipsをここに集約させましょう!
2010/04/25 13:32:44 UTCfatrow
#
エディタが気合入ってるw
2010/04/25 13:35:09 UTCmaking
#
http://wmd-editor.com/ これです > editor これのパーサーと実際のパーサー(Java)が違うのでLive Previewと実際の結果が若干異なりますw
2010/04/25 13:51:35 UTCfatrow
#
コードの各先頭に 4つの半角スペース入れるのがコピペの時に煩雑なような気がします。
2010/04/25 13:56:05 UTCmaking
#
範囲選択してエディタの101010ってやつをクリックしてください > コード
#
あとコードはカッコが続いてないとlispコードとしてハイライトしてくれないので、カッコじゃないところは適当にコメントアウトしてくださいw
2010/04/25 18:56:09 UTCfatrow
#
clojure.test で例外が出ないことの確認ってできます?例外が出たことの確認は(is (thrown? ArithmeticException (/ 1 0))) でできるんですが。
2010/04/25 23:22:19 UTCmaking
#
例外が出ずにテストケースが終了したら、例外がでなかったことになるんでは?予期せぬ例外が発生した場合はerrorsにカウントされますけど。
2010/04/25 23:38:11 UTCfatrow
#
あーそっか。入れておけばいいだけですね。ありがとうございます。