4 ms·
I wonder if anyone has a favorite example that uses method combinations, or auxiliary methods (:before, :after, :around), or something MOP related. Preferably
by GregBuchholz 10y ago
I wonder if anyone has a favorite example that uses method combinations, or auxiliary methods (:before, :after, :around), or something MOP related. Preferably one that is "in-the-wild" and not invented just to showcase the feature.
- reikonomusha 10y agoThere are lots of examples of auxiliary methods. Here's an example of using around-methods to add slot-caching logic to a project for formula rendering: https://bitbucket.org/tarballs_are_good/formulador/src/639107f9266d5c4c2c679390f89153fe449bc201/boxes.lisp?at=default&fileviewer=file-view-default#boxes.lisp-60 https://bitbucket.org/tarballs_are_good/formulador/src/63910...
- lispm 10y agohttps://github.com/sellout/quid-pro-quo https://github.com/sellout/quid-pro-quo Design by contract implemented via method combinations / MOP.
- junke 10y ago> Something MOP related Postmodern[0] defines simple wrapper objects so that you can access databases rows as objects. The same goes for the Elephant persistent database[1]. Cells[2] define metaobjects for classes with dataflow dependencies where slots can be automatically updated in a reactive fashion. :AROUND methods and the like are used quite often. In fact, the default way of defining a "constructor" function for your class is to specialize "initialize-instance" with an :after qualifier, so that you can fill slots that could not be initialized with the arguments to "make-instance" or the default initargs. [0] http://marijnhaverbeke.nl/postmodern/ http://marijnhaverbeke.nl/postmodern/ [1] https://common-lisp.net/project/elephant/ https://common-lisp.net/project/elephant/ [2] https://common-lisp.net/project/cells/ https://common-lisp.net/project/cells/
- batspace 10y agoAt work we have a condition (think: exception) hierarchy that uses multiply inherited mixins. One might be validation-failure and introduce a slot telling you the invalid value. Another might be user-error that records the user that triggered the error. A third might carry an RPC error code for use if reported over RPC. I used a generic function with list combination to collect from the mixins only the slots that should be reported over RPC. The user is not among them since it is always reported to the user that triggered the error.
- PuercoPop 10y agoSeems pretty nifty, would love if you could share a gist [implementation] of the idea
- spacebat 10y agoAh, it wasn't list, it was append. Though list would be fine if each mixin contributes no more than one item, I wanted mixins to be able to contribute more if necessary, so they always return lists which the combination appends to the result. It also allows them to decide to return nil and behave as though they were not called at all. Here's a suitably abstracted implementation of the idea: https://gist.github.com/spacebat/dbad3b50684b3a516071abb3757dc585 https://gist.github.com/spacebat/dbad3b50684b3a516071abb3757... Yes I am likening RPC programming to dealing with monsters in the darkness.
- spacebat 10y agoRobert Smith gave a nice presentation involving using the MOP for defining abstract, final and singleton classes. Then he goes down a rabbit hole of user-defined JIT compilation: https://dl.dropboxusercontent.com/u/734346/JIT-Compilation-of-Symbolic-Functions_Robert-Smith.pdf https://dl.dropboxusercontent.com/u/734346/JIT-Compilation-o...
- spacebat 10y agoHe mentions funcallable instances in the talk. Here's a toy example of such a creature: https://gist.github.com/spacebat/a2805737477ab330334edd1361b34dce https://gist.github.com/spacebat/a2805737477ab330334edd1361b...