Peter Siebel - Practical Common Lisp
Здесь есть возможность читать онлайн «Peter Siebel - Practical Common Lisp» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Год выпуска: 2005, ISBN: 2005, Издательство: Apress, Жанр: Программирование, на английском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.
- Название:Practical Common Lisp
- Автор:
- Издательство:Apress
- Жанр:
- Год:2005
- ISBN:1-59059-239-5
- Рейтинг книги:4 / 5. Голосов: 1
-
Избранное:Добавить в избранное
- Отзывы:
-
Ваша оценка:
- 80
- 1
- 2
- 3
- 4
- 5
Practical Common Lisp: краткое содержание, описание и аннотация
Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Practical Common Lisp»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.
Practical Common Lisp — читать онлайн бесплатно полную книгу (весь текст) целиком
Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Practical Common Lisp», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.
Интервал:
Закладка:
Surprising as it may seem, it actually is possible to make anonymous functions recurse. However, you must use a rather esoteric mechanism known as the Y combinator . But the Y combinator is an interesting theoretical result, not a practical programming tool, so is well outside the scope of this book.
209
It's not required that WITH-SLOTS
be implemented with SYMBOL-MACROLET
—in some implementations, WITH-SLOTS
may walk the code provided and generate an expansion with x
, y
, and z
already replaced with the appropriate SLOT-VALUE
forms. You can see how your implementation does it by evaluating this form:
(macroexpand-1 '(with-slots (x y z) obj (list x y z)))
However, walking the body is much easier for the Lisp implementation to do than for user code; to replace x
, y
, and z
only when they appear in value positions requires a code walker that understands the syntax of all special operators and that recursively expands all macro forms in order to determine whether their expansions include the symbols in value positions. The Lisp implementation obviously has such a code walker at its disposal, but it's one of the few parts of Lisp that's not exposed to users of the language.
210
One version of f2cl is available as part of the Common Lisp Open Code Collection (CLOCC): http://clocc.sourceforge.net/
. By contrast, consider the tricks the authors of f2j, a FORTRAN-to-Java translator, have to play. Although the Java Virtual Machine (JVM) has a goto instruction, it's not directly exposed in Java. So to compile FORTRAN gotos, they first compile the FORTRAN code into legal Java source with calls to a dummy class to represent the labels and gotos. Then they compile the source with a regular Java compiler and postprocess the byte codes to translate the dummy calls into JVM-level byte codes. Clever, but what a pain.
211
Since this algorithm depends on values returned by RANDOM
, you may want to test it with a consistent random seed, which you can get by binding *RANDOM-STATE*
to the value of (make-random-state nil)
around each call to algorithm-s
. For instance, you can do a basic sanity check of algorithm-s
by evaluating this:
(let ((*random-state* (make-random-state nil))) (algorithm-s 10 200))
If your refactorings are all valid, this expression should evaluate to the same list each time.
212
This is a pretty reasonable restriction—it's not entirely clear what it'd mean to return from a form that has already returned—unless, of course, you're a Scheme programmer. Scheme supports continuations , a language construct that makes it possible to return from the same function call more than once. But for a variety of reasons, few, if any, languages other than Scheme support this kind of continuation.
213
If you're the kind of person who likes to know how things work all the way down to the bits, it may be instructive to think about how you might implement the condition system's macros using BLOCK
, TAGBODY
, closures, and dynamic variables.
214
UNWIND-PROTECT
is essentially equivalent to try/finally
constructs in Java and Python.
215
And indeed, CLSQL, the multi-Lisp, multidatabase SQL interface library, provides a similar macro called with-database
. CLSQL's home page is at http://clsql.b9.com
.
216
A small handful of macros don't pass through extra return values of the forms they evaluate. In particular, the PROG1
macro, which evaluates a number of forms like a PROGN
before returning the value of the first form, returns that form's primary value only. Likewise, PROG2
, which returns the value of the second of its subforms, returns only the primary value. The special operator MULTIPLE-VALUE-PROG1
is a variant of PROG1
that returns all the values returned by the first form. It's a minor wart that PROG1
doesn't already behave like MULTIPLE-VALUE-PROG1
, but neither is used often enough that it matters much. The OR
and COND
macros are also not always transparent to multiple values, returning only the primary value of certain subforms.
217
The reason loading a file with an IN-PACKAGE
form in it has no effect on the value of *PACKAGE*
after LOAD
returns is because LOAD
binds *PACKAGE*
to its current value before doing anything else. In other words, something equivalent to the following LET
is wrapped around the rest of the code in LOAD
:
(let ((*package* *package*)) ...)
Any assignment to *PACKAGE*
will be to the new binding, and the old binding will be restored when LOAD
returns. It also binds the variable *READTABLE*
, which I haven't discussed, in the same way.
218
In some implementations, you may be able to get away with evaluating DEFUN
s that use undefined macros in the function body as long as the macros are defined before the function is actually called. But that works, if at all, only when LOAD
ing the definitions from source, not when compiling with COMPILE-FILE
, so in general macro definitions must be evaluated before they're used.
219
By contrast, the subforms in a top-level LET
aren't compiled as top-level forms because they're not run directly when the FASL is loaded. They will run, but it's in the runtime context of the bindings established by the LET
. Theoretically, a LET
that binds no variables could be treated like a PROGN
, but it's not—the forms appearing in a LET
are never treated as top-level forms.
220
The one declaration that has an effect on the semantics of a program is the SPECIAL
declaration mentioned in Chapter 6.
221
The kind of programming that relies on a symbol data type is called, appropriately enough, symbolic computation. It's typically contrasted to numeric programming. An example of a primarily symbolic program that all programmers should be familiar with is a compiler—it treats the text of a program as symbolic data and translates it into a new form.
222
Every package has one official name and zero or more nicknames that can be used anywhere you need to use the package name, such as in package-qualified names or to refer to the package in a DEFPACKAGE
or IN-PACKAGE
form.
223
Интервал:
Закладка:
Похожие книги на «Practical Common Lisp»
Представляем Вашему вниманию похожие книги на «Practical Common Lisp» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.
Обсуждение, отзывы о книге «Practical Common Lisp» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.