Sure, I was considering that anyway. I'm not sure, though, whether it
should be in its own library all by its lonesome or in one with at least a
fairly generic name, since I've got some other macro-related utilities
(specifically https://github.com/bwo/macroparser) that could all be
usefully (I think) grouped together.


On Thu, Jul 11, 2013 at 7:02 PM, Zach Tellman <ztell...@gmail.com> wrote:

> It looks like the macroexpansion code in conditions.free is fairly
> generic.  What would you say to putting it into its own library?
>
>
> On Thu, Jul 11, 2013 at 6:54 PM, Ben Wolfson <wolf...@gmail.com> wrote:
>
>> On Thu, Jul 11, 2013 at 6:48 PM, Zach Tellman <ztell...@gmail.com> wrote:
>>
>>> Yeah, for safety's sake I need to macroexpand everything, which wipes
>>> out the &env for internal macros.  There might be a gentler way to do this,
>>> but it's not obvious to me.  If anyone has suggestions, I'd be interested
>>> in hearing them.
>>
>>
>> You can track the environment through expansion:
>>
>>
>> https://github.com/bwo/conditions/blob/master/test/conditions/free_test.clj#L19
>>
>> The core.async internals do something similar (or did at the time of
>> release, that code has been rewritten, apparently).
>>
>> You're also missing some binding forms:
>>
>> proteus> (clojure.pprint/pprint (macroexpand-1 '(let-mutable [x 1] (try
>> (/ 1 0) (catch Exception x (set! x 2) x)))))
>> (clojure.core/let
>>  [x (new proteus.Containers$L 1)]
>>  (do
>>   (try
>>    (. clojure.lang.Numbers (divide 1 0))
>>    (catch Exception (.x x) (do (.set x 2) nil) (.x x)))))
>>
>>
>> proteus> (clojure.pprint/pprint (macroexpand-1 '(let-mutable [x 1] (letfn
>> [(x [] 4)] (set! x 4) x))))
>> (clojure.core/let
>>  [x (new proteus.Containers$L 1)]
>>  (do (letfn* [x (fn* x ([] 4))] (do (.set x 4) nil) (.x x))))
>>
>>
>>
>>
>>>
>>> Zach
>>>
>>>
>>> On Thursday, July 11, 2013 6:35:21 PM UTC-7, Ben wrote:
>>>
>>>> Note:
>>>>
>>>> proteus> (defmacro aif [test then else]
>>>>            (let [it (first (filter #(not (contains? &env %))
>>>>                               **     (cons 'it (map #(symbol (str
>>>> "it-" %)) (iterate inc 1)))))]
>>>>              `(let [~it ~test] (if ~it ~then ~else))))
>>>> #'proteus/aif
>>>> proteus> (aif (get {:x {:y 3}} :x)
>>>>               (aif (get it :y)
>>>>                    [it it-1]
>>>>                    it)
>>>>               nil)
>>>> [{:y 3} 3]
>>>> proteus> (let-mutable [x 1]
>>>>                       (aif (get {:x {:y 3}} :x)
>>>>                            (aif (get it :y)
>>>>                               **  (set! x [it it-1])
>>>>                               **  (set! x it))
>>>>                            (set! x nil))
>>>>                       x)
>>>> CompilerException java.lang.RuntimeException: Unable to resolve symbol:
>>>> it-1 in this context, compiling:(NO_SOURCE_PATH:1:1)
>>>> proteus>
>>>>
>>>>
>>>>
>>>>
>>>> On Thu, Jul 11, 2013 at 6:16 PM, Zach Tellman <ztel...@gmail.com>wrote:
>>>>
>>>>> There was some discussion a few days ago about how the lack of local
>>>>> mutable variables were harming performance, or possibly elegance, I'm not
>>>>> sure.  Regardless, I fixed it: 
>>>>> https://github.com/**ztellman/proteus<https://github.com/ztellman/proteus>
>>>>>
>>>>> Enjoy!
>>>>>
>>>>> --
>>>>> --
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "Clojure" group.
>>>>> To post to this group, send email to clo...@googlegroups.com
>>>>>
>>>>> Note that posts from new members are moderated - please be patient
>>>>> with your first post.
>>>>> To unsubscribe from this group, send email to
>>>>> clojure+u...@**googlegroups.com
>>>>>
>>>>> For more options, visit this group at
>>>>> http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en>
>>>>> ---
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "Clojure" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an email to clojure+u...@**googlegroups.com.
>>>>>
>>>>> For more options, visit 
>>>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>
>>>>> .
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Ben Wolfson
>>>> "Human kind has used its intelligence to vary the flavour of drinks,
>>>> which may be sweet, aromatic, fermented or spirit-based. ... Family and
>>>> social life also offer numerous other occasions to consume drinks for
>>>> pleasure." [Larousse, "Drink" entry]
>>>>
>>>>   --
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To post to this group, send email to clojure@googlegroups.com
>>> Note that posts from new members are moderated - please be patient with
>>> your first post.
>>> To unsubscribe from this group, send email to
>>> clojure+unsubscr...@googlegroups.com
>>> For more options, visit this group at
>>> http://groups.google.com/group/clojure?hl=en
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to clojure+unsubscr...@googlegroups.com.
>>>
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>
>>>
>>>
>>
>>
>>
>> --
>> Ben Wolfson
>> "Human kind has used its intelligence to vary the flavour of drinks,
>> which may be sweet, aromatic, fermented or spirit-based. ... Family and
>> social life also offer numerous other occasions to consume drinks for
>> pleasure." [Larousse, "Drink" entry]
>>
>>  --
>> --
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clojure@googlegroups.com
>> Note that posts from new members are moderated - please be patient with
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+unsubscr...@googlegroups.com
>> For more options, visit this group at
>> http://groups.google.com/group/clojure?hl=en
>> ---
>> You received this message because you are subscribed to a topic in the
>> Google Groups "Clojure" group.
>> To unsubscribe from this topic, visit
>> https://groups.google.com/d/topic/clojure/7HNNiJJTte4/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to
>> clojure+unsubscr...@googlegroups.com.
>>
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>>
>
>  --
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>



-- 
Ben Wolfson
"Human kind has used its intelligence to vary the flavour of drinks, which
may be sweet, aromatic, fermented or spirit-based. ... Family and social
life also offer numerous other occasions to consume drinks for pleasure."
[Larousse, "Drink" entry]

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to