195

To slightly confuse matters, most other I/O functions also accept T and NIL as stream designators but with a different meaning: as a stream designator, T designates the bidirectional stream *TERMINAL-IO*, while NIL designates *STANDARD-OUTPUT* as an output stream and *STANDARD-INPUT* as an input stream.

196

This variant on the ~C directive makes more sense on platforms like the Lisp Machines where key press events were represented by Lisp characters.

197

Technically, if the argument isn't a real number, ~F is supposed to format it as if by the ~D directive, which in turn behaves like the ~A directive if the argument isn't a number, but not all implementations get this right.

198

Well, that's what the language standard says. For some reason, perhaps rooted in a common ancestral code base, several Common Lisp implementations don't implement this aspect of the ~F directive correctly.

199

f you find 'I saw zero elves' to be a bit clunky, you could use a slightly more elaborate format string that makes another use of ~:* like this:

(format nil 'I saw ~[no~:;~:*~r~] el~:*~[ves~;f~:;ves~].' 0) ==> 'I saw no elves.'

(format nil 'I saw ~[no~:;~:*~r~] el~:*~[ves~;f~:;ves~].' 1) ==> 'I saw one elf.'

(format nil 'I saw ~[no~:;~:*~r~] el~:*~[ves~;f~:;ves~].' 2) ==> 'I saw two elves.'

200

This kind of problem can arise when trying to localize an application and translate human-readable messages into different languages. FORMAT can help with some of these problems but is by no means a full-blown localization system.

201

Throws or raises an exception in Java/Python terms

202

Catches the exception in Java/Python terms

203

In this respect, a condition is a lot like an exception in Java or Python except not all conditions represent an error or exceptional situation.

204

In some Common Lisp implementations, conditions are defined as subclasses of STANDARD-OBJECT, in which case SLOT- VALUE, MAKE-INSTANCE, and INITIALIZE-INSTANCE will work, but it's not portable to rely on it.

205

The compiler may complain if the parameter is never used. You can silence that warning by adding a declaration (declare (ignore c)) as the first expression in the LAMBDA body.

206

Of course, if IF wasn't a special operator but some other conditional form, such as COND, was, you could build IF as a macro. Indeed, in many Lisp dialects, starting with McCarthy's original Lisp, COND was the primitive conditional evaluation operator.

Вы читаете Practical Common Lisp
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату