LINUX.ORG.RU

Язык, в котором есть constraints'ы

 constraints, ,


0

4

Это то же самое, что типы данных, но для логики приложения, а не логики исполнителя (CPU).

Пример constraint'а: «constrX is integer, [0..55],[117..200],999»

Другой пример: «constrY is string, regexp(^fo+\s+bar$)»

По-моему по сравнению с ограничениями на внешние данные в духе «вот в этом поле число не должно быть больше 2^32-1» потому что у нас битовая разрядность такая - contraint'ы были бы гиганстким шагом вперёд, позволили бы существенно сократить «проверяющий» код и оптмизировать выполнение за счёт того, что нам не пришлось бы создавать объект только ради того, чтобы убедиться в консистентности значения.

Оптимальным видится такой вариант использования: переменная, заполняемая из внешнего источника -> наложение constraint'ов -> внутренняя переменная с мета-тегом «пройдён constraint такой-то».

Т.е. ограничения - это механизм преимущественно для рантайма, во многом упрощающий тестирование и сопровождение софта. Для проверок соответствия ограничениям нужно писать декларативные определения, а не заниматься индусскими изысками с написанием соотв. кода вручную - желательно, ещё и в 30 разных местах.

Например, во всеми нелюбимом perl'е есть уже львиная доля такой логики: а именно taint mode, когда переменные делятся на «грязные» (из внешних источников) и «чистые». Недостаток - как раз в отсутствии простого механизма наложения ограничений, который бы и «очищал» переменную.

Речь о том, что сами по себе типы данных в компилируемых языках - это сказка о повышении производительности, но никак не о повышении стабильности кода. Потому что если в вашу переменную типа UInt8, которая не может быть за диапазоном [101..143] приехало вдруг 235, а вы это не проверили в рантайме - ну как бы тип данных вас точно не спасёт.

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

★★★★★
Ответ на: комментарий от AndreyKl

Ээ... C++ templates :| Плохо представляю, на что дать ссылку.

Для Int<16> в compile-time сгенерируется класс из struct Int с подстановкой N := 16. Для суммы - отдельный класс с N := N1 + N2.

int main()
{
  Int<16> a = 1;
  Int<24> b = 2;
  auto sum = a + b; // sum: Int<40>
}
Делаем открытый конструктор с проверкой входных данных, и делаем закрытый без проверки. В operator+ и других операциях на Int пользуем закрытый.

anonymous
()

Потому что если в вашу переменную типа UInt8, которая не может быть за диапазоном [101..143] приехало вдруг 235, а вы это не проверили в рантайме - ну как бы тип данных вас точно не спасёт

При таком подходе тебя ничто не спасёт, потому что проц не проверяет, что там получилось при add R1, R2 - всё равно нужно будет в рантайме проверять результат. В любом нормальном языке со строгими типами можно просто определить новый тип и операции на нём которые будут проверять фазу луны до и после вычислений, или что там тебе вздумается. Нет никакого смысла городить ради этого специальный сахарок.

no-such-file ★★★★★
()
Ответ на: комментарий от AndreyKl

Вот положим есть у нас тип class Int16
как прибавить к нему скажем ещё один Int16?
Т.е. ведь уже будет Int32.

Результатом будет int.

положим мы складываем 16 и 8 , Типы должны быть соотвественно Int 16 и Int 8 , а результат будет 24 типа Int 24

Результатом будет int.

Это для C++ по крайней мере.

d_a ★★★★★
()
Ответ на: комментарий от anonymous

Int<16> a = 1;
Int<24> b = 2;
auto sum = a + b; // sum: Int<40>

Что это за ахинея? Вы пытаетесь в compile-time посчитать число битов необходимое для хранения результата или что? У меня например выходит 25 а не 40 (подразумевая что само занятие имеет смысл).

d_a ★★★★★
()
Ответ на: комментарий от anonymous

спасибо за пояснение и пример использования, разобрался, что то смутил Int с большой буквы... Похоже следить за значением суммы, действительно, получится. Меня немного смущает что можно написать

Int<16> a = 1;
Но на сколько я помню, можно запретить такое поведение создав класс, а не структуру. Но тогда, кажется, и operator+ будет вынужден каждый раз использовать конструктор явно. Или нет?
Но главный вопрос всё таки такой: можно ли как то указать что число должно быть меньше 25, скажем? Т.е. я хотел бы использовать конструкцию вроде
Int<16> a = new Int(16);
Int<3> b = new Int(3);

auto c = a + b; // Int<19>

....

// я хотел тут выразить что ожидается тип Int<N> у которого N <= 17
SomeType<Int<N>: N <= 17> st = new SomeType(c);

И используя такую конструкцию получить компил-тайм ошибку?
Т.е. в итоге , с имеет тип Int<19>, а ограничение у SomeType стоит "Int<N> такой что N меньше либо равно 17". Т.е. понятно что я могу добавить банально проверку в конструктор SomeType<17> и проверять в рантайме значение на предмет того что оно меньше «переданного» из темплейта. Но это в рантайме. А в данной ситуации уже во время компиляции видно что здесь 100% ошибка и нужно прервать компиляцию с ошибкой. Можно ли так?

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 2)
Ответ на: комментарий от AndreyKl

Подскажи (или дай прямую ссылку) пжл, будь так добр, что обозначает Int<N1> ?

Найди почти любую библиотеку units of measure для Си++ и черпай оттуда идеи.

tailgunner ★★★★★
()
Ответ на: комментарий от d_a

речь не о с++, ну или не только и не столько о. Смысл в том чтобы в компил тайме вычислить ошибку (в данном случае что число не попало в допустимый диапазон) и выдать ошибку компиляции. Там Int16 и Int16 имеется ввиду что 16 имеет тип Int16, 15 - Int15, 9 - Int9 и т.д. И результатом сложения 9 + 15 должно быть число 24 тип Int24.

Почитай дерево сообщений, если интересно, а то выглядишь странно.

AndreyKl ★★★★★
()
Ответ на: комментарий от tailgunner

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

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

Гм, я понимаю что ты не в тему

Почему это? По-моему, только я здесь в тему (в тему, которая заявлена в хедпосте).

дай ссылку на пример библиотеки

http://www.boost.org/doc/libs/1_61_0/doc/html/boost_units/Units.html

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Почему это? По-моему, только я здесь в тему (в тему, которая заявлена в хедпосте).

а, ну это да, но мы там ведь не совсем об этом, мне кажется ты понял.

спасибо за ссылку.

AndreyKl ★★★★★
()
Ответ на: комментарий от no-such-file

Тестировщик и код-ревьюэр

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от den73

Яро-раскладка == KOI8-C

приветъ (ОПХБЕР :). натктулся на твой топикъ.

а ещё раньше наткнулся на православный KOI8-C — оказывается, съ 2001 года проектъ. ( ispell под винду есть например здесь, словари здесь)

это — дореформенная орфография, реализованная какъ: 1) раскладка на базе KOI8-R + украинская и белорусская 2) словари для ispell (собственно, oldrus-ispell.sf.net ) 3) 323.pl — конверторъ кодировокъ (основные кириллические + translit + utf8 + unicode16 + KOI8-C) 4) text_new2old.pl , text_old2new.pl — переделать текстъ въ стиле дореформенной орфографии.

наиболее полное решение, на мой взглядъ. также тамъ есть и раскладка подъ Win, подъ X11, шрифты TTF подъ винду, шрифты моноширинные .fon на базе xcyr, cronyx подъ винду, Xmodmap раскладка подъ Linux.

въ общемъ, на основе этого можно допилить, невозбранно достигнувъ желаемого.

ещё тамъ есть примеры текстовъ въ старомъ правописании. на вебархиве уцелела более полная копия

правила русскаго правописанъiя

вотъ, для затравки, смъ. И. Ильинъ. О русскомъ правописан?и. (ещё тутъ и тутъ)

Дивное орудіе создалъ себѣ русскій народъ, — орудіе мысли, орудіе душевнаго и духовнаго выраженія, орудіе устнаго и письменнаго общенія, орудіе литературы, поэзіи и театра, орудіе права и государственности, — нашъ чудесный, могучій и глубокомысленный русскій языкъ. Всякій иноземный языкъ будетъ имъ уловленъ и на немъ выраженъ; а его уловить и выразить не сможетъ ни одинъ. Онъ выразитъ точно — и легчайшее, и глубочайшее; и обыденную вещь, и религіозное пареніе; и безысходное уныніе, и беззавѣтное веселье; и лаконическій чеканъ, и зримую деталь, и неизреченную музыку; и ѣдкій юморъ, и нѣжную лирическую мечту. Вотъ что о немъ писалъ Гоголь:

<<Дивишься драгоцѣнности нашего языка: что ни звукъ, то и подарокъ; все зернисто, крупно, какъ самъ жемчугъ, и право, иное названіе еще драгоцѣннѣе самой вещи>>... И еще:<<Самъ необыкновенный языкъ нашъ есть еще тайна... Языкъ, который самъ по себѣ уже поэтъ>>... О немъ воскликнулъ однажды Тургеневъ:<<Во дни сомнѣній, во дни тягостныхъ раздумій о судьбахъ моей родины, — ты одинъ мнѣ поддержка и опора, о, великій, могучій, правдивый и свободный русскій языкъ! Нельзя вѣрить, чтобы такой языкъ не былъ данъ великому народу!>>.

А новое поколѣніе его не уберегло... Не только тѣмъ, что наполнило его неслыханно-уродливыми,<<глухонѣмыми>> (какъ выразился Шмелевъ), безсмысленными словами, слѣпленными изъ обломковъ и обмылковъ революціонной пошлости, но еще особенно тѣмъ, что растерзало, изуродовало и снизило его письменное обличіе. И эту искажающую, смыслъ-убивающую, разрушительную для языка манеру писать — объявило<<новымъ правописаніемъ>>. Тогда какъ на самомъ дѣлѣ эта безграмотная манера нарушаетъ самые основные законы всякаго языка. И это не пустыя жалобы<<реакціонера>>, какъ утверждаютъ иные эмигрантскіе неучи, а сущая правда, подлежащая строгому доказательству.

Всякій языкъ есть явленіе не простое, а сложное; но въ этой сложности все въ языкѣ взаимно связано и обусловлено, все слито воедино, все органически сращено. Такъ и вынашиваетъ его каждый народъ, слѣдуя одной инстинктивной цѣли — вѣрно выразить и вѣрно понять выраженное. И вотъ имено эту цѣль революціонное кривописаніе не только не соблюдаетъ, но грубо и всемѣрно, вызывающе попираетъ.

какъ это вѣрно! готовъ подписаться здесь подъ каждымъ словомъ!

anonymous
()
Ответ на: комментарий от den73

А новое поколѣніе его не уберегло... Не только тѣмъ, что наполнило его неслыханно-уродливыми, «глухонѣмыми» (какъ выразился Шмелевъ), безсмысленными словами, слѣпленными изъ обломковъ и обмылковъ революціонной пошлости, но еще особенно тѣмъ, что растерзало, изуродовало и снизило его письменное обличіе. И эту искажающую, смыслъ-убивающую, разрушительную для языка манеру писать — объявило «новымъ» «правописаніемъ». Тогда какъ на самомъ дѣлѣ эта безграмотная манера нарушаетъ самые основные законы всякаго языка. И это не пустыя жалобы «реакціонера», какъ утверждаютъ иные эмигрантскіе неучи, а сущая правда, подлежащая строгому доказательству.

Всякій языкъ есть явленіе не простое, а сложное; но въ этой сложности все въ языкѣ взаимно связано и обусловлено, все слито воедино, все органически сращено. Такъ и вынашиваетъ его каждый народъ, слѣдуя одной инстинктивной цѣли — вѣрно выразить и вѣрно понять выраженное. И вотъ имено эту цѣль революціонное кривописаніе не только не соблюдаетъ, но грубо и всемѣрно, вызывающе попираетъ.

Языкъ есть прежде всего живой истокъ звуковъ, издаваемыхъ гортанью, ртомъ и носомъ, и слышимыхъ ухомъ. Обозначимъ этотъ звуковой — слуховой составъ языка словомъ «фонема».

Эти звуки въ отличіе отъ звуковъ, издаваемыхъ животными, членораздѣльны: иногда, какъ въ русскомъ, итальянскомъ и французскомъ языкѣ, отчетливы и чеканны, иногда, какъ въ англійскомъ языкѣ неотчетливы, но слитны и расплывчаты. Членораздѣльность эта подчинена особымъ законамъ, которыми вѣдаетъ грамматика: она различаетъ звуки (гласные и согласные), слоги и слова, а въ словахъ корни и ихъ приращенія (префиксы — впереди корня, аффиксы и суффиксы — позади корня); она различаетъ еще роды и числа, склоненія (падежи), и спряженія (у глаголовъ: времена, числа, наклоненія и виды); она различаетъ далѣе части рѣчи (имя существительное, прилагательное, мѣстоименіе, глаголъ и т. д.), а по смысловой связи словъ — части предложенія (подлежащее, сказуемое, опредѣленіе, дополненіе, обстоятельственныя слова и т. д.). Все это вмѣстѣобразуетъ ученіе о формахъ языка и потому можетъ быть обозначено словомъ «морѳема».

Само собой разумѣется, что и фонема и морѳема служатъ смыслу, который онѣ стараются вѣрно и точно выразить и которымъ онѣ внутренно насыщены. Безсмысленные звуки — не образуютъ языка. Безсмысленные суффиксы, падежи, спряженія, мѣстоименія, глаголы и предлоги, дополненія — не слагаютъ ни рѣчи, ни литературы. Здѣсь все живетъ для смысла, т. е. ради того, чтобы вѣрно обозначить разумѣемое, точно его выразить и вѣрно понять. Человѣкъ даже стонетъ и вздыхаетъ не зря и не безсмысленно. Но если и стонъ его, и вздохъ его полны выраженія, если они суть знаки его внутренней жизни, то тѣмъ болѣе его членораздѣльная рѣчь, — именующая, разумѣющая, указующая, мыслящая, обобщающая, доказывающая, разсказывающая, восклицающая, чувствующая и воображающая, — полна живого смысла жизненно драгоцѣннаго и отвѣтственнаго. Весь языкъ служитъ этому смыслу, т. е. тому, что онъ хочетъ сказать и сообщить, и что мы назовемъ «семемою». Она есть самое важное въ языкѣ. Ею все опредѣляется. Возьмемъ хотя бы падежи: каждый изъ нихъ имѣетъ иной смыслъ и передаетъ о предметѣчто-то свое особое. Именительный: — предметъ берется самъ по себѣ, внѣ отношеній къ другимъ предметамъ; родительный: — выражаетъ принадлежность одного предмета — другому; дательный: — указываетъ на приближающее дѣйствіе; въ винительномъ падежѣ ставится имя того объекта, на который направлено дѣйствіе; въ творительномъ падежѣ ставится имя орудія; мѣстный или предложный падежъ указываетъ на обстоятельства и на направленіе дѣйствій. И такъ, дѣло идетъ черезъ всю грамматику...

anonymous
()
Ответ на: комментарий от anonymous

Къ фонемѣ, морѳемѣ и семемѣ присоединяется, наконецъ, запись: слова могутъ быть не только фонетически произнесены, но еще и начертаны буквами; тогда произносящій человѣкъ можетъ отсутствовать, а рѣчь его, если только она вѣрно записана, можетъ быть прочтена, фонетически воспроизведена и вѣрно понята цѣлымъ множествомъ людей, владѣющихъ этимъ языкомъ. Именно такъ возникаетъ вопросъ правописанія.

Какое же «писаніе» есть вѣрное или правое?

Отвѣчаемъ: то, которое точно передаетъ не только фонему, насыщенную смысломъ, и не только морѳему, насыщенную смысломъ, но прежде всего и больше всего самую семему. И скверное, или кривое «писаніе» будетъ то, которое не соблюдаетъ ни фонему, ни морѳему, ни семему. А вотъ именно въ этомъ и повинно революціонное кривописаніе: оно устраняетъ цѣлыя буквы, искажаетъ этимъ смыслъ и запутывает читателя; оно устраняетъ въ мѣстоименіяхъ и прилагательныхъ (множественнаго числа) различія между мужскимъ и женскимъ родомъ и затрудняетъ этимъ вѣрное пониманіе текста; оно обезсмысливаетъ сравнительную степень у прилагательныхъ и тѣмъ вызываетъ сущія недоумѣнія при чтеніи и т. д., и т. д.

Удостовѣримся во всемъ этомъ на живыхъ примѣрахъ.

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

Напримѣръ:

и такъ далѣе. сиё и есть 'constrain'ы — вспоминается язык программирования Nadesico, содержащий падежи и склонения, роды и времена японского естественнаго человекопонятнаго языка

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

далее в тексте Ильина приводится множество достаточно очевидных, образных примеров когда устранение даже одной буквы ѣ приводит к не тем ограничениям, к кривописанию по форме и сумятице в головах, к постмодернисткому изъёбу формы и победы формализма над здравым смыслом.

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

тогда это был бы практически полезный набор ограничений.

anonymous
()
Ответ на: комментарий от den73

в контексте топика — lout/nonpareil

в контексте топика: язык реализации проекта Nonpareil, от автора Lout — это по сути Eiffel + (контрактное программирование) + функционально-объектный язык с системой типов где объект, класс — first class object, и далее, как расписано в papers по реализации Nonpareil --- далее вводится набор правил, ограничений, интвариантов, которые совместно с контрактами, наследованием, ковариантностью вместе образуют более композабельную систему типов.

если TeX — это императивная реализация языка разметки (PDL, типа Ghost PDL = page description language) + набор макросов стилями поверх, императивных

то Lout — это динамически типизированный макропроцессор + язык разметки, а

Nonpareil — статически типизированный макропроцессор + язык разметки.

В итоге, документ на Nonpareil — по сути статически типизированный структурный документ как типы высшего порядка, функционально-объектные first class objects, статически проверяемые компилятором (макропроцессором) на корректность и правильность типов.

например, документ — форма анкеты, которая проверяет корректность заполнения полей.

или, концептуальная модель данных типа STEP EXPRESS.

или, допилить бекенд PS для 2d => Display PostScript для 2D-GUI => OpenGL для 3D

или построенный по ней автоматически GUI на Display PostScript (DPS).

читая про реализацию и внутреннее устройство DPS, например в оконной системе NeWS (SunDew), формируется следущее понимание метасистем по В. Ф. Турчину, макропроцессоров расширяемого языка с метапеременными:

форт без сборки мусора => PostScript = ФОРТ + GC + PDL => Display PostScript, DPS = PS + ООП + GUI => язык реализации NeWS = DPS + green threads + вспомогательные словари, классы, объекты и утилиты

HyperLook — средство авторинга без программирования

PSIBER Space, например 6. The Metacircular PostScript Interpreter. в духе SICP

очень жаль, что NeWS преждевременно почил в бозе. и проприетарная рализация.

сейчас, кабы заменить форт на фактор с composable GUI, добавить тот же Nonpareil и его допилить заодно в плане backend-ов,

=> получим САПР для разработки ВСЕГО (документации, GUI , 3D-моделей, STEP EXPRESS моделей) как среду расширяемой метасистемы — расширяемого макропроцессора PDL, расширяемых метасистем по В. Ф. Турчину, и далее — подходом грамотного программирования LitProg поверх — какой-то «MetaCASE для ВСЕГО»

anonymous
()
Ответ на: в контексте топика — lout/nonpareil от anonymous

TeX — императивный расширяремый макропроцессор, Lout — функциональный динамически типизированный, расширяемый частично на PostScript, NonPareil — функциональный статически типизированный, расширяемый на самом себе метамоделями и структурированными алгебраическими типами высшего порядка которые суть онтологии в STEP EXPRESS, а также система типов функционально-объектного языка программирования и моделирования с типами (объектами и классами) как first class objects

WEB Дональда Кнута — императивный расширяемый метаязыком, гипертекстом как weave/tangle макропроцессор,

....

=> гипотетический WEB на РЕФАЛе В. Ф. Турчина — расширяемая метасистема, нативно поддерживающая прогонку, суперкомпиляцию и специализацию, то есть — автоматизированное построение компилятора из интерпретатора по формулам Футамуры-Турчина

=>> специализации сего на STEP EXPRESS или каком-то гибком языке для ограничений + Semantic Wiki +Smart Wiki (data as code, executable, livecodable)

=>>> гипотетическая идеализированная Litrerate programming 'MetaCASE IDE для всего'

anonymous
()
Ответ на: комментарий от anonymous

https://en.wikipedia.org/wiki/Eiffel_(programming_language)

=>

1. Nonpareil с функциональными объектами и типами как fist class objects

2. Albatross by Helmut Brandl — статически компилируемый, статически проверяемый для model checking

3. сами модели задавать как Nonpareil документы, статически типизированные

4. какой-то метапроцессный, метасистемный фреймворк: например, метод BON вместо UML-моделей. обладает reversability, лучше composability

5. реализацией 3 описывать модели STEP EXPRESS, практически полезные

6. изобразить на этом Smart Wiki, программируемую

7. изобразить на этом Semantic Wiki, со смысловыми запросами

8. ..... ??? суперкомпиляция во все поля ??? ....

9. PROFIT !!!

anonymous
()

Об ограничениях (constraints) принято говорить в несколько другом разрезе, как о декларативном подходе к описанию отношений между объектами. Проблем спейс там ещё урезается, вот это всё. Про CLP тут уже правильно упомянули.

То, что хочешь ты - это скорее дополнительная типизация. Кто ж мешает сделать некий RangedInt<min,max> и построить над ним алгебру? Ну, кроме производительности получившегося решения, конечно :)

Кстати в современных плюсах с constexpr-ами такое смотрелось бы занимательно, наверное.

Тред не читал

yoghurt ★★★★★
()
Ответ на: в контексте топика — lout/nonpareil от anonymous

вдохновляющее чтение про NeWS

немного про NeWS

описание NeWS

интервью автора NeWS, Джеймса Гослинга про её внутреннее устройство

из этой же книги, 4-я глава про сравнение InterLisp-D, D-Lisp, SmallTalk, Cedar, Viewers (... Oberon-2) NeWS и т.п.

tl;dr: NeWS — годная концептуальная идея, неэффективная реализация: медленная, жрущая много памяти. с одной стороны, для исследовательского прототипа вполне неплохо. а в плане эффективной компиляции DPS нужно было двигаться в функциональщину и функциональные объекты, каким-то образом: например Factor или Newspeak

модельно и модульно, композабельно, функционально :)

anonymous
()
Ответ на: комментарий от yoghurt

вот тут интересно, как это «исчисление типов» выполнять статически, а не динамически.

с одной стороны, есть смоллток. с другой — self + beta, с nested classes, prototype inheritance и метаклассами, classes as modules. с третьей — newspeak сочетающий это всё + classes as software services, executable grammars, mirrors, worlds

это попытка добавить модульность в смоллток, чуть поменяв язык и получив в итоге две pluggable implementations: раскрутив на базе Squeak, FFI или native API для SmallTalk/NewSpeak bare os on hardware.

в пределе, получив pluggable types, graduate typing, predicate dispatch.

с другой, отдельной, строрны — есть Factor, в котором смоллток реализован как DSL на PEG. и всё то же что в Newspeak раскручено поверх Squeak теоретически можно раскрутить из этой реализации

надеясь на то, что функционально-конкатенативный Factor возможно, лучше соптимизирует, чем из динамического Squeak делать почти функциональную реализацию :)

Ну, кроме производительности получившегося решения, конечно :)

теоретически, нужно копать в сторону повышения функциональщины :) для лучшей модульности, оптимизируемости и производительности

anonymous
()
Ответ на: комментарий от yoghurt

вовсѣ нѣтъ, я — не онъ. просто нѣкто.

однако же, къ qulinxao отношусь съ уважениемъ.

интересно мыслитъ :)

anonymous
()
Ответ на: комментарий от yoghurt

Я вот все треды в которых этот анонимус пишет бережно храню, так-как у него очень интересный взгляд на мир компенсаторный (кторый мог случиться, но увы так и не настал и вряд ли настанет) и куча интересной инфы всегда. Жаль, что изза того, что товарищ пишет из-под анонимуса, нельзя собрать все его коменты по всему форуму, приходится внимательно следить за тредами в которые он потенциально может отписаться.

kremator666
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.