Method combinations strategies based on the non-default method combination types in CLOS. All non-default method combinations follow the same basic pattern:
(operator (primary-method-1 args) (primary-method-2 args) (primary-method-3 args)))
(Example from "Object-Oriented Programming in Common Lisp", Keene 1988.)
The non-default method combinations each support primary methods and :around methods, but not :before or
:after. Unlike the standard combination, primary methods do not support call-next-method (next-method in
Methodical).
There are 9 built-in method combinations types in CLOS, excluding standard: progn, append, list, nconc,
and, or, max, min, and +. These are mostly the same in the implementation below, with the following
exceptions:
The progn combo is instead named do, which you probably could have guessed.
list has been replaced by seq, which returns a lazy sequence -- a very Clojurey improvement.
Both nconc and append concatenate lists, but nconc does it destructively; append copies all arguments
except the last. The Clojure equivalent of either is concat which is what I have named the method combination
below. We actually do one better than CLOS and return a lazy sequence, but lazy-cat seemed like a cumbersome name
for the combo.
One last difference: unlike CLOS operator method combinations, primary method implementations are not qualfied by their operator.
;; CLOS (defmethod total-electric-supply + ((city city)) ...)
;; Methodical (defmethod total-electric-supply :city [city] ...)
Method combinations strategies based on the non-default method combination types in CLOS. All non-default method
combinations follow the same basic pattern:
(operator (primary-method-1 args)
(primary-method-2 args)
(primary-method-3 args)))
(Example from "Object-Oriented Programming in Common Lisp", Keene 1988.)
The non-default method combinations each support primary methods and `:around` methods, but not `:before` or
`:after`. Unlike the standard combination, primary methods do not support `call-next-method` (`next-method` in
Methodical).
There are 9 built-in method combinations types in CLOS, excluding `standard`: `progn`, `append`, `list`, `nconc`,
`and`, `or`, `max`, `min`, and `+`. These are mostly the same in the implementation below, with the following
exceptions:
* The `progn` combo is instead named `do`, which you probably could have guessed.
* `list` has been replaced by `seq`, which returns a lazy sequence -- a very Clojurey improvement.
* Both `nconc` and `append` concatenate lists, but `nconc` does it destructively; `append` copies all arguments
except the last. The Clojure equivalent of either is `concat` which is what I have named the method combination
below. We actually do one better than CLOS and return a lazy sequence, but `lazy-cat` seemed like a cumbersome name
for the combo.
One last difference: unlike CLOS operator method combinations, primary method implementations *are not* qualfied by
their operator.
;; CLOS
(defmethod total-electric-supply + ((city city))
...)
;; Methodical
(defmethod total-electric-supply :city
[city]
...)(defoperator operator-name [methods-binding invoke-binding] & body)Define a new operator that can be used as part of an OperatorMethodCombination. See examples below for more
details.
Define a new operator that can be used as part of an `OperatorMethodCombination`. See examples below for more details.
(operator operator-name)Define a new operator that can be used as part of an OperatorMethodCombination. See examples below for more
details. Prefer using the defoperator macro to adding a method to this directly.
Define a new operator that can be used as part of an `OperatorMethodCombination`. See examples below for more details. Prefer using the `defoperator` macro to adding a method to this directly.
(operator-method-combination operator-name)Create a new method combination using the operator named by operator-name, a keyword name of one of the
defoperator forms above or defined externallly.
(operator-method-combination :max)
Create a new method combination using the operator named by `operator-name`, a keyword name of one of the `defoperator` forms above or defined externallly. (operator-method-combination :max)
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |