description | repo for portaCL |
last change | Thu, 08 Mar 2012 05:15:58 |
url | http://repo.kepibu.org/portaCL/ |
project url | http://code.kepibu.org/portaCL/ |
mailing list url | http://lists.kepibu.org/listinfo/portaCL |
PortaCL: Easing the Creation of CL Portability Libraries
Sometimes you want to do something based upon features. Often, that results in lots of reader conditionals, and a final reader conditional duplicating and negating all previous conditionals. Ew!
It’s not uncommon for a portability library to include something like:
(:file #+sbcl "port-sbcl" #+clisp "port-clisp" #-(or sbcl clisp) (error "not supported"))
port-file and port-modules allow you to specify things more like so:
(:port-file "port-~A")
or, less positionally,
(:port-file "port-~/implementation/")
Whether such magical divinations are a good thing is left to you to decide.
port-file and port-module both also support specification of an :alternate-file, which if specified will be used in place of throwing a not-implemented error. E.g., for use if only one or two implementations need special behavior.
You can also specify :not-found-condition, the condition type which will be thrown if no applicable file is found. (e.g., you might prefer ‘not-supported instead, or ‘not-necessary if a missing component is okay).
Useful for indicating a particular thing is not implemented.
This is the default condition thrown when an implementation-specific ASDF component is not found.
A particular thing is not implemented and won’t be. E.g., because the lisp implementation lacks the necessary features.
If this thing is not implemented, it didn’t need to be.
When specified as the :not-found-condition in a defsystem form, will cause operations on the component to be considered successful even if the component could not be found.
Given a feature expression, returns true if that expression is true.
see CLHS 24.1.2.1 for details.
Defines a feature test which shall return true if the given feature expressions apply.
see feature-tests.lisp for usage examples.
A macro version of #+foo (thing) #+bar (thing2) #-(or foo bar) (no-thing), with all the caveats and shortcomings that implies.
feature-case, except always includes a final (error ‘not-implemented).
It might be useful to also offer up the operating system for interpolation into port-files. (e.g., via ~/platform/ or ~/operating-system/).
It might also be useful to offer a way to specify that certain implementations should be treated just like another implementation. E.g.,
(:port-file "port-~a" :treat-as (:ecl :sbcl))
could be used by usocket, instead of futzing with :alternate-file.
Per-file implementation is not the only possible or used porting approach. Perhaps some others should also be supported?
(list #+(or) #+package:notexported a b c) (list #+(or) #+notapackage:foo a b c)
NOTE: this bug is shared by the standard readers of at least SBCL, Clisp, and Lispworks; but not by Allegro.
trivial-features smooths out the unnecessary differences between implementation features alexandria implements a #’featurep which exactly matches that used by the standard’s #+/#- readmacros. cl-syntax-sugar Offers a feature-case reader which is almost certainly more useful than portaCL’s feature-cond macro.