Skip to content

Commit

Permalink
more fixes for wrong references...
Browse files Browse the repository at this point in the history
  • Loading branch information
alexott committed Mar 1, 2014
1 parent 4cac47d commit a80351a
Show file tree
Hide file tree
Showing 14 changed files with 40 additions and 88 deletions.
10 changes: 5 additions & 5 deletions chapter-03.tex
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ \chapter{Практикум: Простая база данных}
описаны гораздо более систематически.

Одно замечание по терминологии: в этой главе я расскажу о некоторых операторах Lisp. В
главе~\ref{ch:4} вы узнаете, что Common Lisp предоставляет три разных типа операторов: функции,
главе~\ref{ch:04} вы узнаете, что Common Lisp предоставляет три разных типа операторов: функции,
макросы и операторы специального назначения. Для целей этой главы вам необязательно
понимать разницу. Однако я буду ссылаться на различные операторы как на функции, макросы
или специальные операторы, в зависимости от того, чем они на самом деле являются, вместо
Expand Down Expand Up @@ -127,7 +127,7 @@ \section{Заполнение CD}
Lisp при объявлении глобальных переменных. \footnote{Использование глобальной переменной
имеет ряд недостатков~--- например, вы можете использовать только одну базу данных в
каждый момент времени. В гл. 27, имея за плечами уже солидный багаж знаний о Lisp, вы
будете готовы к созданию более гибкой базы данных. В~\ref{ch:6} главе вы также увидите, что даже
будете готовы к созданию более гибкой базы данных. В~\ref{ch:06} главе вы также увидите, что даже
использование глобальных переменных в Common Lisp более гибко, чем это возможно в других
языках.}

Expand Down Expand Up @@ -642,7 +642,7 @@ \section{Выполнение запросов к базе данных}
перестанет существовать после выхода из \code{artist-selector}\footnote{Техническое
обозначение функции, ссылающейся на свободную переменную в своём контексте~---
\textbf{замыкание}, потому что функция как бы <<смыкается>> над переменной. Я подробнее
расскажу о замыканиях в главе~\ref{ch:6}.}. Функция выглядит странно, но она работает именно так,
расскажу о замыканиях в главе~\ref{ch:06}.}. Функция выглядит странно, но она работает именно так,
как нам нужно~--- если вызвать \code{artist-selector} с аргументом <<Dixie Chicks>>, мы
получим анонимную функцию, которая ищет CD с полем \code{:artist}, содержащим \code{"Dixie
Chicks"}, и если вызвать её с аргументом \code{"Lyle Lovett"}, то мы получим другую функцию,
Expand Down Expand Up @@ -803,8 +803,8 @@ \section{Обновление существующих записей — пов
\end{lstlisting}

Ещё одна новинка в этой функции\translationnote{Автор ещё забыл упомянуть макрос \stdcode{WHEN}. Он
будет подробно рассмотрен в~\ref{ch:7} главе.}~--- приложение \stdcode{SETF} к
сложной форме вида \code{(getf row :title)}. Я расскажу о \stdcode{SETF} подробнее в главе~\ref{ch:6},
будет подробно рассмотрен в~\ref{ch:07} главе.}~--- приложение \stdcode{SETF} к
сложной форме вида \code{(getf row :title)}. Я расскажу о \stdcode{SETF} подробнее в главе~\ref{ch:06},
но сейчас вам просто нужно знать, что это общий оператор присваивания, который может
использоваться для присваивания друг другу различных "вещей", а не только переменных. (То,
что \stdcode{SETF} и \stdcode{GETF} имеют настолько похожие имена~--- просто совпадение. Между
Expand Down
16 changes: 8 additions & 8 deletions chapter-04.tex
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ \section{Вскрытие чёрного ящика}
вычисления форм.

Это разделение чёрного ящика имеет несколько следствий. Одно из них состоит в том, что вы
можете использовать s-выражения, как вы видели в главе~\ref{ch:3}, в качестве внешнего формата для
можете использовать s-выражения, как вы видели в главе~\ref{ch:03}, в качестве внешнего формата для
данных, не являющихся исходным кодом, используя \textbf{READ} для их чтения и
\textbf{PRINT} для их записи\footnote{Не все объекты Lisp могут быть записаны таким
образом, чтобы их можно было снова прочитать. Но все, что вы можете прочитать с помощью
Expand Down Expand Up @@ -263,7 +263,7 @@ \section{S-выражения как формы Lisp}
пустой список) является допустимой формой Lisp, а также любой список, который содержит
символ в качестве своего первого элемента, также является допустимой формой
Lisp\footnote{Другой, редко используемый тип форм Lisp~--- это список, первый элемент
которого является лямбда-формой. Я обсужу этот тип форм в главе~\ref{ch:5}}.
которого является лямбда-формой. Я обсужу этот тип форм в главе~\ref{ch:05}}.

Конечно, интересным является не синтаксис форм Lisp, а то, как эти формы вычисляются. Для
целей дальнейшего обсуждения вам достаточно думать о процедуре вычисления как о функции,
Expand All @@ -279,7 +279,7 @@ \section{S-выражения как формы Lisp}
остальное. Символ, вычисляемый как форма, трактуется как имя переменной и вычисляется в её
текущее значение\footnote{Существует одна иная возможность~--- возможно определить
\textit{символьный} макрос (\textit{symbol macros}), который вычисляется немного по
другому. Мы не должны беспокоиться об этом}. Я обсужу в главе~\ref{ch:6} как переменные получают
другому. Мы не должны беспокоиться об этом}. Я обсужу в главе~\ref{ch:06} как переменные получают
свои значения впервые. Также следует заметить, что некоторые <<переменные>> являются старым
программистским оксюмороном: <<константными переменными>>. Например, символ \textbf{PI}
именует константную переменную, чьё значение~--- число с плавающей точкой, являющееся
Expand All @@ -288,7 +288,7 @@ \section{S-выражения как формы Lisp}
Все остальные атомы (числа и строки) являются типом объектов, который вы уже рассмотрели
-- это \textit{самовычисляемые объекты} (\textit{self-evaluating objects}). Это означает,
что когда выражение передаётся в воображаемую функцию вычисления, оно просто
возвращается. Вы видели примеры самовычисляемости объектов в главе~\ref{ch:2}, когда набирали 10 и
возвращается. Вы видели примеры самовычисляемости объектов в главе~\ref{ch:02}, когда набирали 10 и
\code{"hello, world"} в REPL.

Символы также могут быть самовычисляемыми в том смысле, что переменной, которую именует
Expand Down Expand Up @@ -356,7 +356,7 @@ \section{Специальные операторы}
Нужно сказать, что не все операции могут быть определены как функции. Так как все
аргументы функции вычисляются перед её вызовом, не существует возможности написать
функцию, которая ведёт себя как оператор \textbf{IF}, который вы использовали в
главе~\ref{ch:3}. Для того, чтобы увидеть почему, рассмотрим такую форму:
главе~\ref{ch:03}. Для того, чтобы увидеть почему, рассмотрим такую форму:

\begin{lstlisting}
(if x (format t "yes") (format t "no"))
Expand Down Expand Up @@ -432,7 +432,7 @@ \section{Специальные операторы}
В общем, специальные операторы реализуют возможности языка, которые требуют специальной
обработки процедурой вычисления. Например, некоторые специальные операторы манипулируют
окружением, в котором вычисляются другие формы. Один из них, который я обсужу детально в
главе~\ref{ch:6},~--- \textbf{LET}, который используется для создания новой \textit{привязки
главе~\ref{ch:06},~--- \textbf{LET}, который используется для создания новой \textit{привязки
переменной} (\textit{variable binding}). Следующая форма вычисляется в 10, так как
второй x вычисляется в окружении, где он именует переменную, связанную оператором
\textbf{LET} со значением 10:
Expand All @@ -446,7 +446,7 @@ \section{Макросы}
В то время как специальные операторы расширяют синтаксис Common Lisp, выходя за пределы
того, что может быть выражено простыми вызовами функций, множество специальных операторов
ограничено стандартом языка. С другой стороны, макросы дают пользователям языка способ
расширения его синтаксиса. Как вы увидели в главе~\ref{ch:3}, макрос~--- это функция, которая
расширения его синтаксиса. Как вы увидели в главе~\ref{ch:03}, макрос~--- это функция, которая
получает в качестве аргументов s-выражения и возвращает форму Lisp, которая затем
вычисляется на месте формы макроса. Вычисление формы макроса происходит в две фазы:
сначала элементы формы макроса передаются, не вычисляясь, в функцию макроса, а затем
Expand All @@ -471,7 +471,7 @@ \section{Макросы}
назначает смысл s-выражениям, используемым в \textit{форме} этого макроса (macro form),
посредством того, как он использует эти s-выражения для генерации своего
расширения. Другими словами, каждый макрос определяет свой собственный локальный
синтаксис. Например, макрос переворачивания списка задом наперёд из главы~\ref{ch:3} определяет
синтаксис. Например, макрос переворачивания списка задом наперёд из главы~\ref{ch:03} определяет
синтаксис, в котором выражение является допустимой перевёрнутой формой если её список,
будучи перевёрнутым, является допустимой формой Lisp.

Expand Down
10 changes: 5 additions & 5 deletions chapter-05.tex
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ \section{Определение новых функций}
определённых случаях. Например, функции, которые преобразуют значения из одного типа в
другой, иногда используют символ \code{->} в имени. Или функция, которая преобразует
строку в виджет, может быть названа \code{string->widget}. Наиболее важное соглашение по
именованию, затронутое в главе~\ref{ch:2}, заключается в том, что лучше создавать составные имена,
именованию, затронутое в главе~\ref{ch:02}, заключается в том, что лучше создавать составные имена,
используя знак минус вместо подчёркивания или использования заглавных букв внутри имени.
Так что \code{frob-widget} лучше соответствует стилю Lisp, чем \lstinline!frob_widget! или
\code{frobWidget}.
Expand Down Expand Up @@ -84,7 +84,7 @@ \section{Определение новых функций}
значение функции. Для возврата из любой точки функции может использоваться специальный
оператор \code{RETURN-FROM}, что я продемонстрирую через некоторое время.

В главе~\ref{ch:2} мы написали функцию \code{hello-world}, которая выглядела вот так:
В главе~\ref{ch:02} мы написали функцию \code{hello-world}, которая выглядела вот так:

\begin{lstlisting}
(defun hello-world () (format t "hello, world"))
Expand Down Expand Up @@ -323,7 +323,7 @@ \section{Именованные параметры}
\end{lstlisting}

Когда функция вызывается, каждый именованный параметр связывается со значением, которое
указано после ключевого слова, имеющего то же имя, что и параметр. Вернёмся к главе~\ref{ch:4}, в
указано после ключевого слова, имеющего то же имя, что и параметр. Вернёмся к главе~\ref{ch:04}, в
которой указывалось, что ключевые слова~--- это имена, которые начинаются с двоеточия, и
которые автоматически определяются как константы, вычисляемые сами в себя FIXME
(self-evaluating).
Expand Down Expand Up @@ -535,7 +535,7 @@ \section{Функции как данные, или Функции высшег
В Lisp функции являются просто другим типом объектов. Когда вы определяете функцию с
помощью \code{DEFUN}, вы в действительности делаете две вещи: создаёте новый
объект-функцию, и даёте ему имя. Кроме того, имеется возможность, как вы
увидели в главе~\ref{ch:3}, использовать \code{LAMBDA} для создания функции без
увидели в главе~\ref{ch:03}, использовать \code{LAMBDA} для создания функции без
имени. Действительное
представление объекта-функции, независимо от того, именованный он или нет, является
неопределённым~--- в компилируемых вариантах Lisp, они вероятно состоят в основном из
Expand All @@ -561,7 +561,7 @@ \section{Функции как данные, или Функции высшег

В действительности, вы уже использовали \code{FUNCTION}, но это было
замаскировано. Синтаксис \lstinline!#'!, который вы использовали в
главе~\ref{ch:3}, является синтаксической обёрткой для \code{FUNCTION}, точно
главе~\ref{ch:03}, является синтаксической обёрткой для \code{FUNCTION}, точно
также как и \code{'} является обёрткой для \code{QUOTE}.\footnote{Лучше всего
рассматривать \code{FUNCTION} как специальный вид экранирования.
Экранирование символа предотвращает его вычисление, оставляя сам символ, а не
Expand Down
Loading

0 comments on commit a80351a

Please sign in to comment.