Hi everyone,
I have just released ContextL 0.40. The idea is that this version is feature-complete with regard to the feature set of the upcoming 1.0 release. So the goal is to test this version now, and in the meantime I hope I will find enough time to write up some more decent documentation of ContextL before version 1.0 is eventually released.
IMPORTANT: There are some changes in the API of ContextL 0.40 compared to previous versions. If you rely on the old version and cannot afford to switch to 0.40 yet for some reason, I have also provided a new version 0.32 which has the same API as before, but just fixes an important internal bug I have discovered recently. If for some reason you can indeed not switch to 0.40, please let me know and I'll see what I can do to fix potential issues.
For those who are willing to switch, here are the changes that will probably affect your code:
+ The functions activate-layer and activate-layer-using-class have been renamed to adjoin-layer and adjoin-layer-using-class, and deactivate-layer and deactivate-layer-using-class have been renamed to remove-layer and remove-layer-using-class. The new names reflect better what these functions actually do. However, the semantics haven't changed.
+ Removed the functions funcall-with-layers and apply-with-layers. Use the functions funcall-with-layer-context and apply-with-layer- context instead. (That API was ugly, and I guess it was never used.)
+ The deflayer macro doesn't take a :layer-class option anymore, but instead a :metaclass option. (I have tried to abstract from the internal representation as CLOS classes, but that turns out to be useless for the time being.) There is no change in semantics here, you just have to switch from :layer-class to :metaclass in a deflayer form, that's all.
And now to some of the new features in this release:
+ Added the functions funcall-with-layer-context and apply-with- layer-context, as hopefully better replacements for funcall-with- layers and apply-with-layers.
+ Added the function current-layer-context. This captures the set of currently active layers, which can later be reinstalled with funcall-with-layer-context and apply-with-layer-context. (This should be handy in conjunction with continuations, as for example in continuation-based web frameworks.)
+ Added the readers layered-function-definer, layered-function- argument-precedence-order, layered-function-lambda-list for layered- function objects.
+ Added the readers layered-method-lambda-list, layered-method- specializers, layered-method-layer for layered-method objects.
+ Added the readers slot-definition-layered-readers and slot- definition-layered-writers for layered slot definition metaobjects.
+ You can now specify an :in-layer option in slot specifiers. This means that a slot within a define-layered-class form can be declared to be in a different layer than the respective class itself. This should allow, for example, grouping of slots of different layers in the same define-layered-class form.
+ Layers and layered functions can now also have uninterned symbols as names. This enables a form of anonymous layers and anonymous layered functions when gensym is used to create names for them. It's then probably also better to pass these symbols around instead of the first-class layers or functions themselves.
+ Added the function ensure-layer for programmatically creating layers.
Finally some internal changes, which are not necessarily visible to application programmers:
+ Some of the :in-layer keyword parameters to internal functions have previously taken lists of layers for technical reasons. This is not the case anymore. This doesn't affect those who have used the define-layered-class, but if you have used plain defclass forms with the respective :metaclass options in the past, you may have to change the corresponding :in-layer class options.
+ Changed the internal handling of the :defining-metaclass option for partial classes. In the previous versions, that option actually didn't get recorded properly. Fortunately, that didn't affect the correctness of the behavioral semantics. (phew ;)
+ Layered direct slot definition metaobjects don't take :layered- reader, :layered-writer and :layered-accessor initargs anymore, but rather :layered-readers and :layered-writers, which is closer to how the CLOS MOP works as well.
+ Added methods for print-object for the major classes and metaclasses, such that, for example, debug output now prints more nicely.
So this all effectively means that I have kept my announcements from beginning of January of this year with a delay of only two months. (Hey, that's better than both Microsoft and Apple. ;)
Please feel free to ask any questions, either in the closer-devel mailing list (the preferred forum), or in private email.
Cheers, Pascal