diff --git a/pixie/vm/atom.py b/pixie/vm/atom.py index ae42ab2d..77ecd50d 100644 --- a/pixie/vm/atom.py +++ b/pixie/vm/atom.py @@ -10,8 +10,15 @@ class Atom(object.Object): def type(self): return Atom._type - def __init__(self, boxed_value): + def with_meta(self, meta): + return Atom(self._boxed_value, meta) + + def meta(self): + return self._meta + + def __init__(self, boxed_value, meta=nil): self._boxed_value = boxed_value + self._meta = meta @extend(proto._reset_BANG_, Atom) @@ -26,6 +33,15 @@ def _deref(self): assert isinstance(self, Atom) return self._boxed_value +@extend(proto._meta, Atom) +def _meta(self): + assert isinstance(self, Atom) + return self.meta() + +@extend(proto._with_meta, Atom) +def _with_meta(self, meta): + assert isinstance(self, Atom) + return self.with_meta(meta) @as_var("atom") def atom(val=nil): diff --git a/tests/pixie/tests/test-stdlib.pxi b/tests/pixie/tests/test-stdlib.pxi index 36b6d09f..bf7f9323 100644 --- a/tests/pixie/tests/test-stdlib.pxi +++ b/tests/pixie/tests/test-stdlib.pxi @@ -683,11 +683,12 @@ (t/assert= 5 ((comp inc inc inc inc) 1)) (t/assert= :xyz ((comp) :xyz))) -(t/deftest test-swap-reset +(t/deftest test-atom (let [a (atom 0)] (t/assert= 1 (swap! a inc)) (t/assert= 2 (swap! a inc)) - (t/assert= 3 (reset! a 3)))) + (t/assert= 3 (reset! a 3)) + (t/assert= :bar (-> a (with-meta {:foo :bar}) meta :foo)))) (t/deftest pre-post-conds (let [f (fn ([a] {:pre [(even? a)] :post [(= % 6)]} (/ a 2))