Common Lisp

Поделись знанием:
Перейти к: навигация, поиск
Common Lisp
Семантика:

мультипарадигмальный: объектно-ориентированный, функциональный, императивный, метаязык

Тип исполнения:

компилируемый

Появился в:

1984, стандартизирован ANSI в 1994

Автор:

комитет X3J13

Система типов:

сильная, динамическая, с опциональными декларациями типов

Основные реализации:

Allegro Common Lisp, ABCL, CLISP, Clozure CL, CMUCL, Corman Common Lisp, ECL, LispWorks, Scieneer CL, SBCL

Испытал влияние:

Lisp, Lisp Machine Lisp, MacLisp, InterLisp, Scheme

Повлиял на:

Clojure, Factor, Dylan, EuLisp, ISLisp, SKILL, Stella, SubL

Common Lisp (сокр. CL) — диалект языка Лисп, стандартизированный ANSI[1]. Был разработан с целью объединения разрозненных на тот момент диалектов Лиспа. Доступно несколько реализаций Common Lisp, как коммерческих, так и свободно распространяемых.

Common Lisp — мультипарадигменный язык программирования общего назначения. Он поддерживает комбинацию процедурного, функционального и объектно-ориентированного программирования.

Common Lisp включает в себя CLOS; систему Lisp макросов, позволяющую вводить в язык новые синтаксические конструкции, использовать техники метапрограммирования и обобщённого программирования.





История

После предложения управляющего из ARPA Боба Энгельмора разработать единый общий стандарт Лисп диалекта, началась работа над Common Lisp'ом в 1981 году. Многое в первоначальной структуре языка было разработано посредством связи через электронные письма. Первый обзор Common Lisp'а был произведён Гайем Льюисом Стилом на ACM симпозиуме по Лиспу и функциональному программированию 1982 года.

Первая документация по языку была опубликована в 1984 году как «Язык Common Lisp, первая редакция». Вторая редакция, выпущенная в 1990 году, включала много изменений, произведённых ANSI над языком в процессе стандартизации. Конечную же редакцию стандарта опубликовали в 1994 году.

С тех пор никаких обновлений стандарта выпущено не было, а различные расширения и улучшения Common Lisp'а (Unicode, параллелизм, основанные на CLOS ввод и вывод) обеспечиваются реализацией и библиотеками (многие доступны посредством Quicklisp)

Синтаксис

Common Lisp использует S-выражения для обозначения как кода, так и данных. Вызовы функций и макросов являются списками, где первый элемент, или голова списка, является именем функции, а остальные, — «хвост» списка, — аргументами.

(+ 2 2)                       ; складывает 2 и 2, возвращая результат 4. 
(- 8 3)                       ; вычитает из восьми три, возвращая результат 5. 
(reverse "Здравствуй, мир!")  ; переворачивает строку, возвращая «"!рим ,йувтсвардЗ"»

;; определения переменных и функций:
(defvar *x*)                  ; Определяет переменную *x*, не присваивая ей какого-либо
                              ; значения. Две звёздочки, являющиеся частью имени — принятый 
                              ; стандарт для именования глобальных переменных.

(setf *x* 42.1)               ; присваивает переменной *x* значение с плавающей запятой 42,1.

(defun square (x)             ; Определение функции square, получающей один аргумент
  (* x x))                    ; и возвращающей его квадрат.

(square *x*)                  ; вызывает функцию square, передавая ей значение переменной *x*
                              ; и возвращает её квадрат (1772,41).

(let ((a 3)(b 4)) (+ a b))    ; Функция let создаёт локальные переменные, присваивает им значения
                              ; (в данном случае переменной a присваивается значение 3, а b - 4), 
                              ; после чего вычисляет и возвращает результат функции
                              ; (в данном случае 7). Переменные локальны, следовательно
                              ; попытка посчитать значение (+ a b) вне тела let приведёт к ошибке.

Типы данных

Скалярные типы

Числовые типы включают в себя целые, дроби, числа с плавающей запятой и комплексные числа.[2] Common Lisp даёт возможность использовать большие числа для представления любых величин с большей точностью.

Литеры в Common Lisp не ограничены ASCII. Большинство современных реализаций поддерживают Юникод.

Понятие Символа довольно близко Лиспу, хотя, практически неизвестно в таком виде в других языках. В Лиспе символ — это уникальный объект из данных, включающих в себя: имя, значение, функцию, список свойств и пакет (пространство имён). Символы в Лиспе часто используются так же, как идентификаторы в других языках: для хранения значения переменной. Однако, у них есть множество других применений. Обычно, когда символу присваивается значение, оно тут же им и возвращается. Некоторые символы присваивают значение сами себе, так, например, булевы значения представлены в качестве двух самоопределяющихся символов, — T и NIL.

Есть несколько функций для округления скалярных типов разными способами. Функция round округляет аргумент до ближайшего целого числа, а если число стоит «посередине», то до ближайшего чётного. Функция truncate округляет числа по направлению к нулю. Функции floor («пол») и ceiling («потолок») округляют к ближайшему меньшему и ближайшему большему числу соответственно. Все функции возвращают дробную часть в качестве вторичного результата.

Структуры данных

Последовательностями в Common Lisp являются списки, векторы, битовые векторы и строки. Есть множество операций, которые могут работать с любым типом последовательности.

Как и почти во всех других диалектах Лиспа, списки в Common Lisp состоят из точечных пар (conses). cons — это структура данных с двумя слотами: car и cdr. Список является связной цепочкой точечных пар (или может быть пустым). car каждой пары ссылается на элемент списка (возможно, другой список). cdr каждой пары ссылается следующую пару, за исключением последней пары в списке, чей cdr ссылается на значение nil. Точечные пары также легко могут быть использованы для реализации деревьев и других сложных структур данных; хотя вместо этого, как правило, рекомендуется использовать структуры или экземпляры классов. Кроме того, можно создать циклическую структуру данных с точечными парами.

Common Lisp поддерживает многомерные массивы и может динамически изменять размер у регулируемых массивов, если потребуется. Многомерные массивы могут быть использованы для матричных вычислений. Вектор является одномерным массивом. Массивы могут содержать любой тип в качестве элемента (даже смешивать разные типы в одном массиве) или могут быть специализированы, чтобы содержать только определенный тип. Обычно поддерживаются только несколько типов. Многие реализации могут оптимизировать функции работы с массивами, когда массив типоспециализирован. Есть два стандартных типоспециализированных массива: строка, являющаяся вектором символов (char), и вектор битов.

Хеш-таблица хранит отображение между объектами. Любой объект может быть использован в качестве ключа или значения. Хэш-таблицы автоматически изменяют размер по мере необходимости.

Пакеты — коллекции символов, используемых в основном для разделения частей программы на пространства имен. Пакет может экспортировать некоторые символы, пометив их как часть открытого интерфейса. Пакеты могут использовать другие пакеты.

Структуры, аналогичные структурам в Си и записям в Паскаль, представляют произвольные сложные структуры данных с любым количеством и типом полей (называемых слотами). Структуры позволяют одиночное наследование.

Классы похожи на структуры, но они предлагают множественное наследование и более динамическое поведение (см. CLOS). Классы были добавлены в Common Lisp поздно, и они в чём-то концептуально перекрывают структуры. Объекты, созданные из классов, называются экземплярами. Особым случай являются обобщённые (generic) функции. Обобщенные функции являются одновременно функциями и экземплярами.

Функции

Common Lisp поддерживает функции первого класса. Например, можно писать функции, принимающие другие функции в качестве аргументов или возвращающие функции.

Библиотека Common Lisp в значительной степени основывается на таких функциях. Например, функция sort берёт функцию сравнения и, опционально, функцию ключа, чтобы сортировать структуры данных согласно ключу.

 ;; Сортирует список, используя функции > и <.
 (sort (list 5 2 6 3 1 4) #'>)   ; возвращает (6 5 4 3 2 1)
 (sort (list 5 2 6 3 1 4) #'<)   ; возвращает (1 2 3 4 5 6)
 ;; Сортирует список по первым элементам подсписков.
 (sort (list '(9 A) '(3 B) '(4 C)) #'< :key #'first)   ; возвращает ((3 B) (4 C) (9 A))

Определение функций

Макрос defun определяет функцию. defun принимает имя функции, имена параметров и тело функции:

 (defun square (x)
   (* x x))

Определения функций могут включать директивы компилятора, известные как declarations, которые дают подсказки компилятору об оптимизациях или о типах аргументов. Также могут быть добавлены строки документации (docstrings), которые Лисп может использовать для предоставления документации:

 (defun square (x)
   "Calculates the square of the single-float x."
   (declare (single-float x) (optimize (speed 3) (debug 0) (safety 1)))
   (the single-float (* x x)))

Анонимные функции определяются с помощью lambda, например, (lambda (x) (* x x)) — функция возведения в квадрат. Стиль программирования на Лиспе подразумевает частое использование функций высшего порядка, в которые удобно передавать анонимные функции как аргументы.

Локальные функцие могут быть объявлены с помощью flet и labels.

 (flet ((square (x)
          (* x x)))
   (square 3))

Существует несколько других операторов, относящихся к определению и манипуляциям с функциями. Например, функции могут быть скомпилированы с compile оператором. (Некоторые Лисп системы выполняют функции, используя по умолчанию интерпретатор, если не указано compile; другие компилируют каждую функцию).

Реализации

Common Lisp отличается от таких языков, как C#, Java, Perl, Python тем, что он определяется своим стандартом и не существует его единственной или канонической реализации. Любой желающий может ознакомиться со стандартом и создать свою собственную реализацию. Common Lisp автоматически признаёт эти типы как равные.[3]

Таблица сравнения основных реализаций[4][5]
Название Поддерживаемые платформы Компиляция Возможности Лицензия
CLISP[6] Windows, Mac, *nix Байт-код, JIT Маленький размер образа лисп-системы. Очень эффективная длинная целочисленная арифметика. Возможность создания исполняемых файлов. FFI(интерфейс для вызова низкоуровневых функций(функций из библиотек, написанных на Си и т. п.) и для оперирования «неуправляемой» памятью). Функции обратного вызова(интеграция с «родным» кодом платформы). GNU GPL
CMUCL[7] Linux, FreeBSD, Solaris, Darwin Байт-код, машинный код Высококачественный компилятор в машинный код. FFI. Функции обратного вызова(интеграция с «родным» кодом платформы). Общественное достояние с частями под BSD License
ECL Windows, *nix, Mac OS X Байт-код, машинный код через C Хорошая интеграция с программами на Си и с «родным» кодом платформы(FFI, функции обратного вызова, возможность создания «родных» для платформы динамических и статических библиотек). Возможность создания исполняемых файлов. «Родная» многопоточность на всех поддерживаемых платформах. GNU GPL с частями под другими лицензиями
Clozure CL (бывший OpenMCL)[8] Linux/PPC, Linux/X86-64, Darwin/PPC, Darwin/X86-64, FreeBSD/X86-64, Windows Машинный код Быстрый компилятор. Мощный и удобный FFI. Функции обратного вызова(интеграция с «родным» кодом платформы). Возможность создания исполняемых файлов. «Родная» многопоточность на всех поддерживаемых платформах. LGPL
SBCL[9] Linux, BSD, Solaris, Mac OS X (Darwin), Windows (экспериментально) Машинный код Высококачественный компилятор в машинный код. Возможность создания исполняемых файлов. FFI. Функции обратного вызова(интеграция с «родным» кодом платформы). «Родная» многопоточность на Linux, Solaris 10 и Mac OS X. Общественное достояние с частями под MIT License и BSD License
ABCL[10] JVM байт-код JVM Интерфейс к платформе Java. Многопоточность. Платформонезависимость. LGPL
Allegro Common Lisp[11] Windows, Unix, Linux, Mac OS X Машинный код franz.com/products/allegrocl/ Коммерческая, доступна ограниченная демоверсия
LispWorks[12] Windows, *nix, Mac OS X Машинный код Высококачественная IDE. CAPI — библиотека для создания пользовательского интерфейса. Хорошая интеграция с программами на Си и с «родным» кодом платформы(FFI, функции обратного вызова, возможность создания «родных» для платформы динамических и статических библиотек). Возможность создания исполняемых файлов. «Родная» многопоточность на всех поддерживаемых платформах. Полный список возможностей: www.lispworks.com/products/features.html Коммерческая, доступна ограниченная демоверсия
Corman Common Lisp Windows Машинный код www.cormanlisp.com/features.html С 2015 года — MIT License. Изначально распространялся как Shareware, с доступным исходным кодом системы (исключая IDE)

Напишите отзыв о статье "Common Lisp"

Примечания

  1. ANSI INCITS 226—1994 (R2004), ранее X3.226-1994 (R1999)
  2. [abhishek.geek.nz/docs/features-of-common-lisp Features of Common Lisp]
  3. [lisper.ru/pcl/lather-rinse-repeat-a-tour-of-the-repl#fnt__3 Lisp — программируемый язык программирования.]
  4. [www.cliki.net/Common%20Lisp%20implementation Список основных реализаций Common Lisp]
  5. [wiki.alu.org/Implementation Lisp Implementations]
  6. [clisp.sourceforge.net/ GNU CLISP (англ.).]
  7. [www.cons.org/cmucl/ CMUCL]
  8. [openmcl.clozure.com/ Clozure CL]
  9. [sbcl.sourceforge.net/ Steel Bank Common Lisp (англ.)]
  10. [armedbear.org/abcl.html Armed Bear Common Lisp]
  11. [www.franz.com/ Allegro CL — разработчик Franz Inc. (англ.)]
  12. [www.lispworks.com/products/lispworks.html LispWorks]. Разработчик — LispWorks, LLC (ранее Xanalys, Inc.)

Ссылки

Сообщества и форумы
  • [lisper.ru lisper.ru — русскоязычное сообщество Common Lisp разработчиков] (рус.)
  • [lisp.ystok.ru/ru/index.html Лисп у «Истоков» — русский LispWorks, проекты с исходным кодом, форумы] (рус.)
  • [common-lisp.net/ common-lisp.net — хостинг для размещения open source проектов] (англ.)
Статьи
  • [www.nestor.minsk.by/sr/2003/07/30710.html Lisp: побеждая посредственность] (рус.)
  • [love5an.livejournal.com/356336.html Особенности CL в контексте освоения языка] (рус.)
Документация и учебники
  • [lisper.ru/pcl/ Книга «Практический Common Lisp»] (рус.)
  • [www.gigamonkeys.com/book/ Книга «Practical Common Lisp»] (англ.)
  • [www.cliki.net/ CLiki — Common Lisp Wiki] (англ.)
  • [common-lisp.net/~dlw/LispSurvey.html Common Lisp Implementations: A Survey] (англ.)
  • [www.lispworks.com/documentation/HyperSpec/Front/ Common Lisp HyperSpec — стандарт ANSI Common Lisp] (англ.)
  • [www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html Common Lisp the Language, 2nd Edition by by Guy L. Steele — классическое руководство по Common Lisp] (англ.)
  • [cl-cookbook.sourceforge.net/ The Common Lisp Cookbook] (англ.)
  • [www.paulgraham.com/onlisp.html Paul Graham. On Lisp] (англ.)
  • [clisp.linkfly.ru clisp.linkfly.ru Ресурс с множеством различных материалов по Common Lisp]

Отрывок, характеризующий Common Lisp

– Нет, недавно…
– Что он вам нравится?
– Да, он приятный молодой человек… Отчего вы меня это спрашиваете? – сказала княжна Марья, продолжая думать о своем утреннем разговоре с отцом.
– Оттого, что я сделал наблюдение, – молодой человек обыкновенно из Петербурга приезжает в Москву в отпуск только с целью жениться на богатой невесте.
– Вы сделали это наблюденье! – сказала княжна Марья.
– Да, – продолжал Пьер с улыбкой, – и этот молодой человек теперь себя так держит, что, где есть богатые невесты, – там и он. Я как по книге читаю в нем. Он теперь в нерешительности, кого ему атаковать: вас или mademoiselle Жюли Карагин. Il est tres assidu aupres d'elle. [Он очень к ней внимателен.]
– Он ездит к ним?
– Да, очень часто. И знаете вы новую манеру ухаживать? – с веселой улыбкой сказал Пьер, видимо находясь в том веселом духе добродушной насмешки, за который он так часто в дневнике упрекал себя.
– Нет, – сказала княжна Марья.
– Теперь чтобы понравиться московским девицам – il faut etre melancolique. Et il est tres melancolique aupres de m lle Карагин, [надо быть меланхоличным. И он очень меланхоличен с m elle Карагин,] – сказал Пьер.
– Vraiment? [Право?] – сказала княжна Марья, глядя в доброе лицо Пьера и не переставая думать о своем горе. – «Мне бы легче было, думала она, ежели бы я решилась поверить кому нибудь всё, что я чувствую. И я бы желала именно Пьеру сказать всё. Он так добр и благороден. Мне бы легче стало. Он мне подал бы совет!»
– Пошли бы вы за него замуж? – спросил Пьер.
– Ах, Боже мой, граф, есть такие минуты, что я пошла бы за всякого, – вдруг неожиданно для самой себя, со слезами в голосе, сказала княжна Марья. – Ах, как тяжело бывает любить человека близкого и чувствовать, что… ничего (продолжала она дрожащим голосом), не можешь для него сделать кроме горя, когда знаешь, что не можешь этого переменить. Тогда одно – уйти, а куда мне уйти?…
– Что вы, что с вами, княжна?
Но княжна, не договорив, заплакала.
– Я не знаю, что со мной нынче. Не слушайте меня, забудьте, что я вам сказала.
Вся веселость Пьера исчезла. Он озабоченно расспрашивал княжну, просил ее высказать всё, поверить ему свое горе; но она только повторила, что просит его забыть то, что она сказала, что она не помнит, что она сказала, и что у нее нет горя, кроме того, которое он знает – горя о том, что женитьба князя Андрея угрожает поссорить отца с сыном.
– Слышали ли вы про Ростовых? – спросила она, чтобы переменить разговор. – Мне говорили, что они скоро будут. Andre я тоже жду каждый день. Я бы желала, чтоб они увиделись здесь.
– А как он смотрит теперь на это дело? – спросил Пьер, под он разумея старого князя. Княжна Марья покачала головой.
– Но что же делать? До года остается только несколько месяцев. И это не может быть. Я бы только желала избавить брата от первых минут. Я желала бы, чтобы они скорее приехали. Я надеюсь сойтись с нею. Вы их давно знаете, – сказала княжна Марья, – скажите мне, положа руку на сердце, всю истинную правду, что это за девушка и как вы находите ее? Но всю правду; потому что, вы понимаете, Андрей так много рискует, делая это против воли отца, что я бы желала знать…
Неясный инстинкт сказал Пьеру, что в этих оговорках и повторяемых просьбах сказать всю правду, выражалось недоброжелательство княжны Марьи к своей будущей невестке, что ей хотелось, чтобы Пьер не одобрил выбора князя Андрея; но Пьер сказал то, что он скорее чувствовал, чем думал.
– Я не знаю, как отвечать на ваш вопрос, – сказал он, покраснев, сам не зная от чего. – Я решительно не знаю, что это за девушка; я никак не могу анализировать ее. Она обворожительна. А отчего, я не знаю: вот всё, что можно про нее сказать. – Княжна Марья вздохнула и выражение ее лица сказало: «Да, я этого ожидала и боялась».
– Умна она? – спросила княжна Марья. Пьер задумался.
– Я думаю нет, – сказал он, – а впрочем да. Она не удостоивает быть умной… Да нет, она обворожительна, и больше ничего. – Княжна Марья опять неодобрительно покачала головой.
– Ах, я так желаю любить ее! Вы ей это скажите, ежели увидите ее прежде меня.
– Я слышал, что они на днях будут, – сказал Пьер.
Княжна Марья сообщила Пьеру свой план о том, как она, только что приедут Ростовы, сблизится с будущей невесткой и постарается приучить к ней старого князя.


Женитьба на богатой невесте в Петербурге не удалась Борису и он с этой же целью приехал в Москву. В Москве Борис находился в нерешительности между двумя самыми богатыми невестами – Жюли и княжной Марьей. Хотя княжна Марья, несмотря на свою некрасивость, и казалась ему привлекательнее Жюли, ему почему то неловко было ухаживать за Болконской. В последнее свое свиданье с ней, в именины старого князя, на все его попытки заговорить с ней о чувствах, она отвечала ему невпопад и очевидно не слушала его.
Жюли, напротив, хотя и особенным, одной ей свойственным способом, но охотно принимала его ухаживанье.
Жюли было 27 лет. После смерти своих братьев, она стала очень богата. Она была теперь совершенно некрасива; но думала, что она не только так же хороша, но еще гораздо больше привлекательна, чем была прежде. В этом заблуждении поддерживало ее то, что во первых она стала очень богатой невестой, а во вторых то, что чем старее она становилась, тем она была безопаснее для мужчин, тем свободнее было мужчинам обращаться с нею и, не принимая на себя никаких обязательств, пользоваться ее ужинами, вечерами и оживленным обществом, собиравшимся у нее. Мужчина, который десять лет назад побоялся бы ездить каждый день в дом, где была 17 ти летняя барышня, чтобы не компрометировать ее и не связать себя, теперь ездил к ней смело каждый день и обращался с ней не как с барышней невестой, а как с знакомой, не имеющей пола.
Дом Карагиных был в эту зиму в Москве самым приятным и гостеприимным домом. Кроме званых вечеров и обедов, каждый день у Карагиных собиралось большое общество, в особенности мужчин, ужинающих в 12 м часу ночи и засиживающихся до 3 го часу. Не было бала, гулянья, театра, который бы пропускала Жюли. Туалеты ее были всегда самые модные. Но, несмотря на это, Жюли казалась разочарована во всем, говорила всякому, что она не верит ни в дружбу, ни в любовь, ни в какие радости жизни, и ожидает успокоения только там . Она усвоила себе тон девушки, понесшей великое разочарованье, девушки, как будто потерявшей любимого человека или жестоко обманутой им. Хотя ничего подобного с ней не случилось, на нее смотрели, как на такую, и сама она даже верила, что она много пострадала в жизни. Эта меланхолия, не мешавшая ей веселиться, не мешала бывавшим у нее молодым людям приятно проводить время. Каждый гость, приезжая к ним, отдавал свой долг меланхолическому настроению хозяйки и потом занимался и светскими разговорами, и танцами, и умственными играми, и турнирами буриме, которые были в моде у Карагиных. Только некоторые молодые люди, в числе которых был и Борис, более углублялись в меланхолическое настроение Жюли, и с этими молодыми людьми она имела более продолжительные и уединенные разговоры о тщете всего мирского, и им открывала свои альбомы, исписанные грустными изображениями, изречениями и стихами.
Жюли была особенно ласкова к Борису: жалела о его раннем разочаровании в жизни, предлагала ему те утешения дружбы, которые она могла предложить, сама так много пострадав в жизни, и открыла ему свой альбом. Борис нарисовал ей в альбом два дерева и написал: Arbres rustiques, vos sombres rameaux secouent sur moi les tenebres et la melancolie. [Сельские деревья, ваши темные сучья стряхивают на меня мрак и меланхолию.]
В другом месте он нарисовал гробницу и написал:
«La mort est secourable et la mort est tranquille
«Ah! contre les douleurs il n'y a pas d'autre asile».
[Смерть спасительна и смерть спокойна;
О! против страданий нет другого убежища.]
Жюли сказала, что это прелестно.
– II y a quelque chose de si ravissant dans le sourire de la melancolie, [Есть что то бесконечно обворожительное в улыбке меланхолии,] – сказала она Борису слово в слово выписанное это место из книги.
– C'est un rayon de lumiere dans l'ombre, une nuance entre la douleur et le desespoir, qui montre la consolation possible. [Это луч света в тени, оттенок между печалью и отчаянием, который указывает на возможность утешения.] – На это Борис написал ей стихи:
«Aliment de poison d'une ame trop sensible,
«Toi, sans qui le bonheur me serait impossible,
«Tendre melancolie, ah, viens me consoler,
«Viens calmer les tourments de ma sombre retraite
«Et mele une douceur secrete
«A ces pleurs, que je sens couler».
[Ядовитая пища слишком чувствительной души,
Ты, без которой счастье было бы для меня невозможно,
Нежная меланхолия, о, приди, меня утешить,
Приди, утиши муки моего мрачного уединения
И присоедини тайную сладость
К этим слезам, которых я чувствую течение.]
Жюли играла Борису нa арфе самые печальные ноктюрны. Борис читал ей вслух Бедную Лизу и не раз прерывал чтение от волнения, захватывающего его дыханье. Встречаясь в большом обществе, Жюли и Борис смотрели друг на друга как на единственных людей в мире равнодушных, понимавших один другого.
Анна Михайловна, часто ездившая к Карагиным, составляя партию матери, между тем наводила верные справки о том, что отдавалось за Жюли (отдавались оба пензенские именья и нижегородские леса). Анна Михайловна, с преданностью воле провидения и умилением, смотрела на утонченную печаль, которая связывала ее сына с богатой Жюли.
– Toujours charmante et melancolique, cette chere Julieie, [Она все так же прелестна и меланхолична, эта милая Жюли.] – говорила она дочери. – Борис говорит, что он отдыхает душой в вашем доме. Он так много понес разочарований и так чувствителен, – говорила она матери.
– Ах, мой друг, как я привязалась к Жюли последнее время, – говорила она сыну, – не могу тебе описать! Да и кто может не любить ее? Это такое неземное существо! Ах, Борис, Борис! – Она замолкала на минуту. – И как мне жалко ее maman, – продолжала она, – нынче она показывала мне отчеты и письма из Пензы (у них огромное имение) и она бедная всё сама одна: ее так обманывают!
Борис чуть заметно улыбался, слушая мать. Он кротко смеялся над ее простодушной хитростью, но выслушивал и иногда выспрашивал ее внимательно о пензенских и нижегородских имениях.
Жюли уже давно ожидала предложенья от своего меланхолического обожателя и готова была принять его; но какое то тайное чувство отвращения к ней, к ее страстному желанию выйти замуж, к ее ненатуральности, и чувство ужаса перед отречением от возможности настоящей любви еще останавливало Бориса. Срок его отпуска уже кончался. Целые дни и каждый божий день он проводил у Карагиных, и каждый день, рассуждая сам с собою, Борис говорил себе, что он завтра сделает предложение. Но в присутствии Жюли, глядя на ее красное лицо и подбородок, почти всегда осыпанный пудрой, на ее влажные глаза и на выражение лица, изъявлявшего всегдашнюю готовность из меланхолии тотчас же перейти к неестественному восторгу супружеского счастия, Борис не мог произнести решительного слова: несмотря на то, что он уже давно в воображении своем считал себя обладателем пензенских и нижегородских имений и распределял употребление с них доходов. Жюли видела нерешительность Бориса и иногда ей приходила мысль, что она противна ему; но тотчас же женское самообольщение представляло ей утешение, и она говорила себе, что он застенчив только от любви. Меланхолия ее однако начинала переходить в раздражительность, и не задолго перед отъездом Бориса, она предприняла решительный план. В то самое время как кончался срок отпуска Бориса, в Москве и, само собой разумеется, в гостиной Карагиных, появился Анатоль Курагин, и Жюли, неожиданно оставив меланхолию, стала очень весела и внимательна к Курагину.
– Mon cher, – сказала Анна Михайловна сыну, – je sais de bonne source que le Prince Basile envoie son fils a Moscou pour lui faire epouser Julieie. [Мой милый, я знаю из верных источников, что князь Василий присылает своего сына в Москву, для того чтобы женить его на Жюли.] Я так люблю Жюли, что мне жалко бы было ее. Как ты думаешь, мой друг? – сказала Анна Михайловна.
Мысль остаться в дураках и даром потерять весь этот месяц тяжелой меланхолической службы при Жюли и видеть все расписанные уже и употребленные как следует в его воображении доходы с пензенских имений в руках другого – в особенности в руках глупого Анатоля, оскорбляла Бориса. Он поехал к Карагиным с твердым намерением сделать предложение. Жюли встретила его с веселым и беззаботным видом, небрежно рассказывала о том, как ей весело было на вчерашнем бале, и спрашивала, когда он едет. Несмотря на то, что Борис приехал с намерением говорить о своей любви и потому намеревался быть нежным, он раздражительно начал говорить о женском непостоянстве: о том, как женщины легко могут переходить от грусти к радости и что у них расположение духа зависит только от того, кто за ними ухаживает. Жюли оскорбилась и сказала, что это правда, что для женщины нужно разнообразие, что всё одно и то же надоест каждому.
– Для этого я бы советовал вам… – начал было Борис, желая сказать ей колкость; но в ту же минуту ему пришла оскорбительная мысль, что он может уехать из Москвы, не достигнув своей цели и даром потеряв свои труды (чего с ним никогда ни в чем не бывало). Он остановился в середине речи, опустил глаза, чтоб не видать ее неприятно раздраженного и нерешительного лица и сказал: – Я совсем не с тем, чтобы ссориться с вами приехал сюда. Напротив… – Он взглянул на нее, чтобы увериться, можно ли продолжать. Всё раздражение ее вдруг исчезло, и беспокойные, просящие глаза были с жадным ожиданием устремлены на него. «Я всегда могу устроиться так, чтобы редко видеть ее», подумал Борис. «А дело начато и должно быть сделано!» Он вспыхнул румянцем, поднял на нее глаза и сказал ей: – «Вы знаете мои чувства к вам!» Говорить больше не нужно было: лицо Жюли сияло торжеством и самодовольством; но она заставила Бориса сказать ей всё, что говорится в таких случаях, сказать, что он любит ее, и никогда ни одну женщину не любил более ее. Она знала, что за пензенские имения и нижегородские леса она могла требовать этого и она получила то, что требовала.
Жених с невестой, не поминая более о деревьях, обсыпающих их мраком и меланхолией, делали планы о будущем устройстве блестящего дома в Петербурге, делали визиты и приготавливали всё для блестящей свадьбы.