Edit: After re-reading some of the ContextL papers, I believe that I am actually just going to use ContextL as it’s a much more flexible superset of this library. I will probably still keep this library published as an example of a non-trivial, but glarkable, method combination.
I am releasing a new library that allows one to dispatch generic methods based on the value of a global parameter.
There are situations where one might like to dispatch a method on some information other than the required parameters of the method. For many situations, it is sufficient to switch between those methods based on some external parameter. The method-versions library allows one to do just that.
Obtaining
- The home page: http://nklein.com/software/method-versions/
- The tar-ball: method-versions_0.1.2011.05.18.tar.gz
- The GPG signature for the tar-ball: method-versions_0.1.2011.05.18.tar.gz.asc
- The main git repository: http://git.nklein.com/lisp/libs/method-versions.git
- A browsable mirror of the git repository: http://github.com/nklein/method-versions
Internationalization Example
In this example, we do a silly form of internationalization. To that end, we will use English as the default language and define some other languages.
(method-versions:define-method-version latin) (method-versions:define-method-version pig-latin) (method-versions:define-method-version french latin) (method-versions:define-method-version spanish latin)
We will prepare a language parameter and a welcome method that is versioned on the language.
(declaim (special *language*)) (defparameter *language* nil) (defgeneric welcome () (:method-combination method-versions:method-version-method-combination *language*))
And, we define welcome methods for the various languages (accidentally forgetting spanish).
(defmethod welcome () :welcome) (defmethod welcome :latin () :velkominum) (defmethod welcome :pig-latin () :elcomeway) (defmethod welcome :french () :bonjour)
Then, we will try each of the languages in turn.
(mapcar #'(lambda (ll) (let ((*language* ll)) (welcome))) '(nil :latin :pig-latin :french :spanish)) => (:welcome :velkominum :elcomeway :bonjour :velkominum)
