I didn't look at wikipedia, I was trying to guess what you meant from your
post. I'm still unclear what you mean in the context of Clojure.

- James

On 24 November 2015 at 00:45, William la Forge <laforg...@gmail.com> wrote:

> Sounds like you looked at wikipedia, which is the only place where I've
> seen mixin refer to the aggregate class. I've always seen mixin, or at
> least my understanding was that a mixin was the class that got added to the
> mixture. Could be just bad editing at the start of the wikipedia page, as
> they seem to reverse the sense of the term as you read further down the
> page. But as I look at other references to mixin, things become less and
> less clear.
>
> Yeah, I am talking about creating compositions by aggregating the contents
> of other maps. It looks like a clearer term for the map being mixed into an
> aggregate would be trait. So I would have a db-file trait, the closer
> trait, the actor trait and the async-channel trait, all of which can be
> used in the composition of a database. Trait is clearer and nicely puts the
> emphasis on the functionality/capability being added.
>
> It is hard coming up with good terms. I very much appreciate your help
> here James.
>
> --b
>
> On Monday, November 23, 2015 at 6:50:21 PM UTC-5, James Reeves wrote:
>>
>> Just to be clear, by "mixin" you're referring to merging two maps of
>> functions?
>>
>> Have you considered using composition instead of mixins?
>>
>> - James
>>
>> On 23 November 2015 at 20:01, William la Forge <lafo...@gmail.com> wrote:
>>
>>> When an object is built from a map, aggregating mixins is a trivial
>>> operation. But when a mixin needs to be closed, it is better to have a
>>> common mechanism to manage a stack of the close functions of all the
>>> aggregated mixins than to depend on application logic to do so. Case in
>>> point, I'd like to use an actor mixin or an alternative async channel mixin
>>> when composing a database. The async channel mixin will require a close but
>>> the actor mixin will not. So I developed the closer mixin to handle the
>>> calls to both the async channel and db file close functions. The database
>>> will only know the closer's do-close method. And it is the responsibility
>>> of the async channel and the db file mixins to register their close
>>> functions with the closer mixin.
>>>
>>>
>>> My inspiration is Stuart Sierra's component library
>>> <https://github.com/stuartsierra/component>. But I am not handling
>>> dependencies per say, only managing a stack of close functions. And the
>>> "components" are only functions and atoms added to a common map structure,
>>> not records or deftypes. The result is a very lightweight pattern for
>>> components. The closer code itself is a lock-free mixin that gets added to
>>> the common map as needed when the on-close method is called.
>>>
>>> For more information, see Closer
>>> <https://github.com/laforge49/aatree/wiki/Closer>.
>>>
>>> (ns aatree.closer
>>>   (:require [clojure.tools.logging :as log]))
>>>
>>> (set! *warn-on-reflection* true)
>>>
>>> (defn on-close [f opts]
>>>   (let [fsa (:closer-fsa opts)]
>>>     (if fsa
>>>       (do
>>>         (swap! fsa
>>>                (fn [fs]
>>>                  (if fs
>>>                    (conj fs f)
>>>                    (atom (list f)))))
>>>         opts)
>>>       (assoc opts :closer-fsa (atom (list f))))))
>>>
>>> (defn- do-closer [fs opts]
>>>   (when fs
>>>     (try
>>>       ((first fs) opts)
>>>       (catch Exception e
>>>         (log/warn e "exception on close")))
>>>     (recur (next fs) opts)))
>>>
>>> (defn do-close [opts]
>>>   (let [fsa (:closer-fsa opts)]
>>>     (if fsa
>>>       (let [fs @fsa]
>>>         (if fs
>>>           (if (compare-and-set! fsa fs nil)
>>>             (do-closer fs opts)
>>>             (recur opts)))))))
>>>
>>> --
>>> 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
>>> ---
>>> 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/d/optout.
>>>
>>
>>

-- 
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/d/optout.

Reply via email to