repos
/
portaCL
/ annotate_shade
summary
|
shortlog
|
log
|
tree
|
commit
|
commitdiff
|
headdiff
|
annotate
|
headblob
|
headfilediff
|
filehistory
normal
|
plain
|
shade
|
zebra
Rename notes.org to README.org
Annotate for file /README.org
2009-07-20 pix
1
#+TITLE: PortaCL: Easing the Creation of CL Portability Libraries
2009-07-17 pix
2
05:24:52 '
3
* Rationale
'
4
'
5
Sometimes you want to do something based upon *features*. Often, that results
2009-07-19 pix
6
in lots of reader conditionals, and a final reader conditional duplicating and
12:27:37 '
7
negating all previous conditionals. Ew!
2009-07-17 pix
8
05:24:52 '
9
* API
'
10
'
11
** ASDF Components: port-file, port-module
'
12
'
13
It's not uncommon for a portability library to include something like:
'
14
:(:file
'
15
: #+sbcl "port-sbcl"
'
16
: #+clisp "port-clisp"
'
17
: #-(or sbcl clisp) (error "not supported"))
'
18
port-file and port-modules allow you to specify things more like so:
'
19
:(:port-file "port-~A")
'
20
or, less positionally,
'
21
:(:port-file "port-~/implementation/")
'
22
'
23
Whether such magical divinations are a good thing is left to you to decide.
'
24
'
25
port-file and port-module both also support specification of an :alternate-file,
'
26
which if specified will be used in place of throwing a not-implemented error.
'
27
E.g., for use if only one or two implementations need special behavior.
'
28
'
29
You can also specify :not-found-condition, the condition type which will be
'
30
thrown if no applicable file is found. (e.g., you might prefer 'not-supported
'
31
instead, or 'not-necessary if a missing component is okay).
'
32
'
33
** Condition: not-implemented
'
34
'
35
Useful for indicating a particular thing is not implemented.
'
36
'
37
This is the default condition thrown when an implementation-specific ASDF
'
38
component is not found.
'
39
'
40
** Condition: not-supported
'
41
'
42
A particular thing is not implemented and won't be. E.g., because the lisp
'
43
implementation lacks the necessary features.
'
44
'
45
** Condition: not-necessary
'
46
'
47
If this thing is not implemented, it didn't need to be.
'
48
'
49
When specified as the :not-found-condition in a defsystem form, will cause
'
50
operations on the component to be considered successful even if the component
'
51
could not be found.
'
52
'
53
** Function: featurep feature-expression
'
54
'
55
Given a feature expression, returns true if that expression is true.
'
56
2009-07-19 pix
57
see [[http://www.lispworks.com/documentation/HyperSpec/Body/24_aba.htm][CLHS 24.1.2.1]] for details.
2009-07-17 pix
58
05:24:52 '
59
** Macro: define-feature-test test-name-or-names lambda-list [documentation] &body
'
60
'
61
Defines a feature test which shall return true if the given feature expressions apply.
'
62
2009-07-20 pix
63
see [[http://repo.kepibu.org/portaCL/feature-tests.lisp][feature-tests.lisp]] for usage examples.
2009-07-17 pix
64
05:24:52 '
65
** Macro: feature-cond ([feature-conditional] [clause]+)*
'
66
'
67
A macro version of #+foo (thing) #+bar (thing2) #-(or foo bar) (no-thing), with
'
68
all the caveats and shortcomings that implies.
'
69
'
70
** Macro: feature-ecase ([[feature-conditional] [clause]+]+)
'
71
'
72
feature-case, except always includes a final (error 'not-implemented).
'
73
'
74
* Future Ideas
'
75
'
76
** ASDF component enhancements
'
77
*** platform / operating system
'
78
'
79
It might be useful to also offer up the operating system for interpolation into
'
80
port-files. (e.g., via ~/platform/ or ~/operating-system/).
'
81
'
82
*** shared-implementation support
'
83
'
84
It might also be useful to offer a way to specify that certain implementations
'
85
should be treated just like another implementation. E.g.,
'
86
:(:port-file "port-~a" :treat-as (:ecl :sbcl))
'
87
could be used by usocket, instead of futzing with :alternate-file.
'
88
'
89
** Other porting styles?
'
90
'
91
Per-file implementation is not the only possible or used porting approach.
'
92
Perhaps some others should also be supported?
'
93
'
94
* SLIME's defimplementation
'
95
* Xach's CLOS-based approach
'
96
* Any others?
'
97
'
98
* Bugs
'
99
2009-07-20 pix
100
* ASDF systems sometimes try to recursively load themselves a couple
06:58:45 '
101
hundred times. (Though I've seen that even without loading portaCL, so
'
102
may not be entirely my bug...)
'
103
* Constructs similar to the ones below will result in an incorrect
'
104
package-error:
2009-07-20 pix
105
:(list #+(or) #+package:notexported a b c)
07:07:16 '
106
:(list #+(or) #+notapackage:foo a b c)
2009-07-20 pix
107
NOTE: this bug is shared by the standard readers of at least SBCL,
06:58:45 '
108
Clisp, and Lispworks; but not by Allegro.
2009-07-17 pix
109
05:24:52 '
110
* see also
2009-07-20 pix
111
18:34:17 '
112
[[http://www.cliki.net/trivial-features][trivial-features]]
'
113
smooths out the unnecessary differences between implementation *features*
'
114
[[http://common-lisp.net/project/alexandria/][alexandria]]
'
115
implements a #'featurep which exactly matches that used by the standard's
'
116
#+/#- readmacros.
'
117
[[http://common-lisp.net/project/cl-syntax-sugar/][cl-syntax-sugar]]
'
118
Offers a feature-case reader which is almost certainly more useful than
'
119
portaCL's feature-cond macro.