Category: литература

Category was added automatically. Read all entries about "литература".

with Cat The Cat

Достоевский, Преступление и наказание

Дочка сходила на "Текст", недавно вышедший фильм по этому роману.

Фамилия главного героя Раскольников, как я понимаю, дано из-за раскола на старообрядцев и современных нам христиан. Главное действие главного героя - решиться на убийство старухи-процентщицы, дающей деньги в рост, под большие проценты.

Сравнив с интересным взглядом на долги в христианстве, я теперь не то, что в недоумении, но чувствую себя странно. Роман-то, похоже, совсем не о том, что пытаются донести в фильме.
with Cat The Cat

Специализация шаблонов в C++

Мне очень нравится, надо сказать.

Код получается разделить достаточно хорошо и защищённо, а также получить оптимальное размещение данных. Прямо сказка, по сравнению с Питоном (по модулю отсутствия подсказок, конечно).

Единственное, что мне не нравится, это отсутствие ограничений на параметры шаблонов, а-ля типы классов Хаскеля. Но сравнимых результатов можно добиться просто другой структурой кода.
with Cat The Cat

Начал читать Еськова.

Эээ.

"Миссия провалена" из уст разведчика?..

Ну нафик.

Резюме - умён, но очень любит казаться умным. По уровню изложения, примерно, на уровне Головачёва, плюс-минус. Уровень идей интересный ("Евангелие от Афрания" я прочёл полностью).

Лично мне знакомиться дальше мешает плохое знание русского языка.
with Cat The Cat

Надо мне высказаться по поводу Питера Уоттса (Peter Watts).

Я осилил Эхопраксию и попытался взять Ложную Слепоту.

Я считаю книги плохими, но, к моему удивлению, продолжаю с ними спорить. Точнее, продолжал и только с Эхопраксией, поскольку когда я сообразил, что группа сверхлюдей и даже один пост-человек не смогли воспроизвести технологию 1986 года, я перестал автора уважать совсем.

Мой друг делил писателей на умных и умничающих. Вторые гораздо популярней первых, потому, что умничать могут многие и читателю очень просто стать на место автора. Умные редко популярны или их популярность довольно тиха.

Джосс Уэдон и Дональд Уэстлейк умные (Уэдон, правда, весьма условно - Мстители). Линч и Уоттс - умничащие. Умничащие считают других за дураков.

В Ложной Слепоте в корабле иноприлетян не работает электроника, из-за электромагнитных полей и радиации. И туда, вместо робота на шнуре (применявшегося в Чернобыле), посылают людей. В том числе, протагониста, полголовы которого начинена электроникой.

В Эхопраксии вампир специально описывается, как очень быстрый и непредсказуемый. Но описывается с точки зрения совершенно нетренированного человека, поскольку чуть потренировав силу и чуть позанимавшись боевыми искусствами (на моём уровне - пять лет Вин Чун и столько же Шотокан, плюс 7 лет силовых тренировок, всё на любительском уровне), вы будете творить чудеса с точки зрения обычного человека. "У тебя действительно сильный хват" после пятой неудачной демонстрации вырывания пистолета из моей слегка напряженной руки (хотя я чуть мухлевал. перемещая "пистолет", мешая правильно его схватить).

В заключении Эхопраксии главный герой, поняв, что заражён неземной формой жизни, давшей ему способность убить вампира, а перед этим даже удивить его своими рассуждениями, прыгает с обрыва, что даёт этой форме жизни возможность передвигаться по поверхности Земли, управляя, фактически, мертвым телом ГГ. Хотя там неподалёку был колодец, который бы значительно затруднил эпическую концовку.

Итого, Уоттс держит меня за дурака. Он считает, что многогении не знают про Чернобыль и что про него не знаю я. его читатель. И он не постарался поставить в протагонисты Эхопраксии хоть сколько-то тренированного человека. хотя для большинства тренированных читателей удивления ГГ будут довольно смешны. И даже поумневший протагонист не может сделать что-то умнее одноходовой пафосной глупости.

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

Даже Головачёв себе такое не позволяет. У последнего всё ориентировано на действие и демонстрацию магических законов (условно применимых в нашей реальности и явно оговариваемых).

PS
Любой удар рукой рассчитан на дистанцию плюс-минус 5 сантиметров (полкулака). Если вас бьют рукой, то можно заметно ослабить удар, переместив ожидаемое место удара на дистанцию чуть больше вдоль направления удара. В частности, если вас бьют в грудь, достаточно просто вдохнуть. Для непосвящённых выглядит, как что-то невероятное.
with Cat The Cat

Комбинаторные разборщики.

Пост ниже является литературным кодом - его можно скопировать в файл и загрузить в интерпретатор.
>-- |ParsersFunc.hs
>-- Реализация комбинаторов синтаксического разбора наиболее конкретным образом.
>module ParsersFunc where


Синтаксический разбор - это извлечение структуры предложения из строки. Или "извлечение структуры текста из его представления в виде букв". Ну, как-то так. На входе у нас текст, на выходе - структура.

Что интересно, обычно описывается преобразование структуры в текст через правила. Например, plus ::= expr + expr это правило, по которому создаётся текст, когда нам надо создать выражение с оператором +. В этом случае текст, созданный для левого и правого вхождений expr произвольный. И задача разборщика - определить, был ли текст создан по правилам, или нет.

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

Обычно у нас может быть некая неопределённость в распознавании правил. Мне нравится слово "уют", поскольку оно довольно страшное, если считать его глаголом. И предложение (вывеска) "Уют любимых" может быть разобрано как глагол и прилагательное или как существительное и прилагательное.

Вооружившись этими двумя соображениями, мы можем представить себе тип функции синтаксического разбора:
>type Parser a = String -> [(a, String)]
Что это говорит в переводе на русский язык?

Тип разборщика это функция из строки (текста на разбор) в список из пар "разобранная структура и остаток текста".

Список означает, что мы можем получить несколько вариантов разбора и даже совсем ничего - список будет пуст. Список у нас ленивый, поэтому если мы будем разбирать в стиле "наиболее длинный разбор вперед", то, несмотря на экспоненциальную сложность, мы получим разбор довольно быстро - лишние варианты просмотрены не будут.

Итак, давайте попробуем собрать парочку-троечку комбинаторов и вспомогательных функций. Первой вспомогательной функцией будет запуск разборщика на строке текста:
>-- |Left "error" означает ошибку, Right value означает успех.
>parse :: String -> Parser a -> Either String a
>parse text parser = case parser text of
>    [] -> Left "no parse"
>    ((value,""):_) -> Right value
>    ((value, unparsed):_) -> Left $ "error somewhere there: "++take 20 unparsed
Эта функция запускает разборщик на тексте и анализирует результат. Она жадная - первый вариант разбора считается предпочтительным. У неё два варианта с ошибкой - не смогли разобрать ничего вообще и не разобрали до конца. Сейчас добавим комбинаторов и посмотрим, как она работает.

Самым простым комбинатором является комбинатор отказа. Он отказывается разбирать что-либо:
>stop :: Parser a
>stop _ = []
Не взирая на вход, он выдаст пустой список результатов, который совместим по типам с любой структурой.

Вторым простым комбинатором является получение очередного символа:
>item :: Parser Char
>item "" = [] -- ничего не можем прочитать.
>item (c:text) = [(c,text)] -- прочитали символ, вернули его и остаток текста
Вот его запуск:
*Main> parse "a" item
Right 'a'
*Main> parse "ab" item
Left "error somewhere there: b"
*Main> parse "Hello, world!" item
Left "error somewhere there: ello, world!"
*Main> 
Диагностика оставляет желать лучшего, но это подождёт.

Третьим простым комбинатором является оператор альтернативы:
>infixl 3 <|>
>(<|>) :: Parser a -> Parser a -> Parser a
>(p <|> q) s = p s ++ q s
Тип показывает, что это функция от двух разборщиков некоей структуры в третий разборщик такой же структуры. Поэтому в скобках стоят p и q. А операнд за скобкой, s, это входной текст. Если развернуть последний Parser a в типе оператора альтернативы, то мы получим вот такое выражение: Parser a -> Parser a -> String -> [(a,String)]. То есть, три операнда, как и в нашем определении. Тело определения состоит в простом соединении результатов. Списки у нас ленивые и разбор q понадобится, только если p не смог и выдал пустой список.

Чтобы интересней было, добавим ещё условный разбор и разбор определенного символа:
>check :: (a -> Bool) -> Parser a -> Parser a
>check cond parser s = filter (cond . fst) (parser s)

>char :: Char -> Parser Char
>char c = check (==c) item
Запустим:
*Main> parse "a" (char 'a' <|> char 'b')
Right 'a'
*Main> parse "b" (char 'a' <|> char 'b')
Right 'b'
*Main> parse "c" (char 'a' <|> char 'b')
Left "no parse"
Ожидаемый результат.

Чтобы добраться до более-менее мощных разборщиков, надо сделать оператор последовательного разбора. Тут уже начинается интереcная магия. Мы сделаем комбинатор, который будет принимать разборщик, конструирующий функции!
>infixl 4 <*>
>(<*>) :: Parser (a -> b) -> Parser a -> Parser b
>(p <*> q) s = [(f a, qs) | (f, ps) <- p s, (a, qs) <- q ps]

>pure :: a -> Parser a -- в текстах по синтаксическому разбору это называется эпсилон.
>pure a s = [(a,s)]
Второй разборщик тривиален - он возвращает какое-то значение, не забирая ничего из текста. А вот первый интересен. Он запускает разборщик p на исходном тексте s. Этот разборщик может вернуть несколько результатов-функций, со своим остатком. И для каждой функции и соответствующего остатка текста мы запускаем второй разборщик на остатке. Второй разборщик разбирает аргумент для функции-результата первого. Окончательный результат - применение разобранной функции к разобранному аргументу и остаток текста после разобранного аргумента.

Вот теперь можно собрать разборщик для списков, а туда войдёт и альтернатива, и пустой раборщик, и последовательный разбор:
>many, many1 :: Parser a -> Parser [a]
>many p = many1 p <|> pure []
>many1 p = pure (:) <*> p <*> many p
И немедленно запустим:
*Main> parse "abababa" (many (char 'a' <|> char 'b'))
Right "abababa"
*Main> parse "abababac" (many (char 'a' <|> char 'b'))
Left "error somewhere there: c"
*Main> parse "" (many (char 'a' <|> char 'b'))
Right ""
*Main> parse "" (many1 (char 'a' <|> char 'b'))
Left "no parse"
Вот. many1 не умеет разбирать пустой список, получили ошибку. many умеет - ошибки нет.

Вот на этом небольшом базисе можно сообразить лексический и даже синтаксический анализ. Поскольку у нас есть предикат для отказа на неправильном содержимом, мы можем собрать даже разбор контекстно-зависимых грамматик. Например, мы можем отвергать XML, если открывающий тэг не будет иметь того же имени, что и закрывающий.

Замечу, что я использовал имена операторов <|>, <*> и pure для удобства и для иллюстрации совместимости синтаксического разбора с классами Applicative и Alternative из Control.Applicative. Впервые они появились в библиотеке uu-parsinglib, имели такие же имена и потом просочились в отдельный классы после работы Конора МакБрайда.
with Cat The Cat

Почему Стругацкие ничего не понимали в гениальности.

"Гений" в Бойцовом Коте всего лишь раскусил одного разведчика и заставил его взять всего лишь него с собой.

Гений в реальной жизни заставил бы разведчика напрячься и прекратить все войны.

"Гений" Стругацких заботился о себе.

Гений в реальной жизни сделал бы жизнь сразу многих лучше.

Речь идёт о гении, как я его понимаю. Это, примерно, Патрик Джейн, только полюбопытнее в области техники.

Надо сказать, что Патрик до Красного Джона гений Стругацких. После - гений скорее в моем понимании.
with Cat The Cat

"Фантастика".

Купившись на положительные отзывы умных людей (первая и ставшая переломной вторая), начал читать "Время Хобо".

Сломался в районе фразы "достат. кол." Источник оной Тигр! Тигр! Альфреда Бестера, если что. Сама фраза встречается в тексте "Времени Хобо" три раза, я посчитал. У Бестера всё было компактно и повторяющийся вопль "достат. кол!" свидетельствовал о полной деградации приютивших Фойла людей.

Резюме: какая-то невнятная хрень, написанная невнятным языком. Автор не понимает символов, по-моему. Или это юмор такой. Да вообще, действовать будем, или как? Начали с действия, плавно разгонялись, а потом скатились в каких-то бройлеров, которые любят читать контрабандные книги.

"file 0.4" мой лысый череп.

Рекомендовать не могу.

PS
Кто не читал Тигр! Тигр! - срочно восполнять пробел. Там и темп, и идеи, и чувства, и любовь. Основа, краеугольный камень, стержень.