122
While frequently used together, the :fill-pointer
and :adjustable
arguments are independent—you can make an adjustable array without a fill pointer. However, you can use VECTOR-PUSH
and VECTOR-POP
only with vectors that have a fill pointer and VECTOR-PUSH-EXTEND
only with vectors that have a fill pointer and are adjustable. You can also use the function ADJUST- ARRAY
to modify adjustable arrays in a variety of ways beyond just extending the length of a vector.
123
Another parameter, :test-not
parameter, specifies a two-argument predicate to be used like a :test
argument except with the boolean result logically reversed. This parameter is deprecated, however, in preference for using the COMPLEMENT
function. COMPLEMENT
takes a function argu-ment and returns a function that takes the same number of arguments as the original and returns the logical complement of the original function. Thus, you can, and should, write this:
(count x sequence :test (complement #'some-test))
rather than the following:
(count x sequence :test-not #'some-test)
124
Note, however, that the effect of :start
and :end
on REMOVE
and SUBSTITUTE
is only to limit the elements they consider for removal or substitution; elements before :start
and after :end
will be passed through untouched.
125
This same functionality goes by the name grep
in Perl and filter
in Python.
126
The difference between the predicates passed as :test
arguments and as the function arguments to the -IF
and -IF-NOT
functions is that the :test
predicates are two-argument predicates used to compare the elements of the sequence to the specific item while the -IF
and -IF-NOT
predicates are one-argument functions that simply test the individual elements of the sequence. If the vanilla variants didn't exist, you could implement them in terms of the - IF versions by embedding a specific item in the test function.
(count char string) ===
(count-if #'(lambda (c) (eql char c)) string)
(count char string :test #'CHAR-EQUAL) ===
(count-if #'(lambda (c) (char-equal char c)) string)
127
If you tell CONCATENATE
to return a specialized vector, such as a string, all the elements of the argument sequences must be instances of the vector's element type.
128
When the sequence passed to the sorting functions is a vector, the 'destruction' is actually guaranteed to entail permuting the elements in place, so you could get away without saving the returned value. However, it's good style to always do something with the return value since the sorting functions can modify lists in much more arbitrary ways.
129
By an accident of history, the order of arguments to GETHASH
is the opposite of ELT
—ELT
takes the collection first and then the index while GETHASH
takes the key first and then the collection.
130
LOOP
's hash table iteration is typically implemented on top of a more primitive form, WITH-HASH-TABLE-ITERATOR
, that you don't need to worry about; it was added to the language specifically to support implementing things such as LOOP
and is of little use unless you need to write completely new control constructs for iterating over hash tables.
131
Adapted from http://us.imdb.com/Quotes?0133093
)