selected='selected'>
. All HTML 4.0-compatible browsers should understand both forms, but some buggy browsers understand only the no-value form for certain attributes. If you need to generate HTML for such browsers, you'll need to hack emit-attributes
to emit those attributes a bit differently.
318
The analogy between FOO's special operators, and macros, which I'll discuss in the next section, and Lisp's own is fairly sound. In fact, understanding how FOO's special operators and macros work may give you some insight into why Common Lisp is put together the way it is.
319
The :noescape
and :attribute
special operators must be defined as special operators because FOO determines what escapes to use at compile time, not at runtime. This allows FOO to escape literal values at compile time, which is much more efficient than having to scan all output at runtime.
320
Note that &attributes
is just another symbol; there's nothing intrinsically special about names that start with &
.
321
The one element of the underlying language-processing infrastructure that's not currently exposed through special operators is the indentation. If you wanted to make FOO more flexible, albeit at the cost of making its API that much more complex, you could add special operators for manipulating the underlying indenting printer. But it seems like the cost of having to explain the extra special operators would outweigh the rather small gain in expressiveness.
322
The combination of Common Lisp's read-time conditionalization and macros makes it quite feasible to develop portability libraries that do nothing but provide a common API layered over whatever API different implementations provide for facilities not specified in the language standard. The portable pathname library from Chapter 15 is an example of this kind of library, albeit to smooth over differences in interpretation of the standard rather than implementation-dependent APIs.
323
A Foreign Function Interface is basically equivalent to JNI in Java, XS in Perl, or the extension module API in Python.
324
As of this writing, the two main drawbacks of UFFI are the lack of support for callbacks from C into Lisp, which many but not all implementations' FFIs support, and the lack of support for CLISP, whose FFI is quite good but different enough from the others as to not fit easily into the UFFI model.
325
Knuth has used the saying several times in publications, including in his 1974 ACM Turing Award paper, 'Computer Programming as an Art,' and in his paper 'Structured Programs with goto Statements.' In his paper 'The Errors of TeX,' he attributes the saying to C.A.R. Hoare. And Hoare, in an 2004 e-mail to Hans Genwitz of phobia.com, said he didn't remember the origin of the saying but that he might have attributed it to Dijkstra.
326
CL-PPCRE also takes advantage of another Common Lisp feature I haven't discussed, DEFINE-COMPILER-MACRO
in your favorite Common Lisp reference for more information about compiler macros.
327
The word
328
Declarations can appear in most forms that introduce new variables, such as LET
, LET*
, and the DO
family of looping macros. LOOP
has its