Re[9]: Насколько важен синтаксис языка?
От: Vermicious Knid  
Дата: 07.09.06 16:21
Оценка: 51 (8) :))
Здравствуйте, fmiracle, Вы писали:


F>В том языке много было удивительных вещей, но меня лично больше всего поразило, что он понимал и требовал(!) использование артиклей(!!) и, хуже того, различал артикли 'a' и 'an' по правилам английского языка (гласная-согласная) и требовал их правильного(!!!) применения!

F>Это было мега.
Есть как минимум еще один такой мега-язык, называется Inform 7. Это DSL для создание игр в жанре interactive fiction(типа Adventure, Zork, итд).

Вот разрозненные примеры "кода" на этом языке:
Martha is a woman in the Vineyard.

The cask is either customs sealed, liable to tax or stolen goods. 

The prevailing wind is a direction that varies. 

The Old Ice House overlooks the Garden. 

A container is bursting if the total weight of things in it is greater than its breaking strain.


Вот пример целой "программы"(взято из описания на wikipedia):

"Hello Wikipedia" by A Wikipedia Contributor

The story headline is "An Interactive Example".

The Living Room is a room. "A comfortably furnished living room."
The Kitchen is north of the Living Room.
The Front Door is south of the Living Room.

The insurance salesman is a man in the Living Room.
The description is "An insurance salesman in a tacky polyester suit.
He seems eager to speak to you." Understand "man" as the insurance salesman.

A briefcase is carried by the insurance salesman.
The description is "A slightly worn, black briefcase."
Understand "case" as the briefcase.

The insurance paperwork is in the briefcase.
The description is "Page after page of small legalese."
Understand "papers" or "documents" or "forms" as the paperwork.

Instead of listening to the insurance salesman:
say "The salesman bores you with a discussion of life insurance policies. From his briefcase he pulls some paperwork which he hands to you.";
now the player carries the insurance paperwork.

Re[26]: Насколько важен синтаксис языка?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 07.09.06 17:15
Оценка: -1
Здравствуйте, VladD2, Вы писали:

VD>Вы, поклонники Смолтока, сидите на этих комнях и упорно их не видите. Для меня это очевидные грабли. Для вас вполне нормальная вещь.


С равным (совершенно равным!) успехом можно пульнуть исключение из любого метода в языке, подобном C++. Например, так:

void SomeClass::func(OtherClass *p)
{
  // ... Делаем что-то
    int intermediate = p->get_some_data(); // И шарахнуть отсюда exception
    // ... Должны бы снова делать что-то
}


И хотя такая возможность есть, но реальную проблему она создаёт нечасто. Точно также и с передачей блоков кода, которые могут содержать "неожиданный возврат". Ну не надо передавать такие блоки кода — и не будет проблемы. Дисциплина-с определённая, знаете ли. Зато местами это может быть очень удобно. Просто интересная возможность сама по себе — изменить граф выполнения функции (метода) извне. Рисковано порой, вероятно, но...

Кстати, перекликается с "проблемами C++" — C++ тоже требует с головой дружить.
<< Под музыку: silent >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[14]: Насколько важен синтаксис языка?
От: FDSC Россия consp11.github.io блог
Дата: 07.09.06 17:56
Оценка: :)
Здравствуйте, VladD2, Вы писали:

FDS>>Да, например в мае на C#, правда она у меня динамически компилировалась прямо в runtime в зависимости от ввода пользователя. Это было ужасно и я не знаю, как это сделать лучше... Вообще, с генерацией кода у меня всё плохо, но по ней совершенно нет ничего понятно написанного.


VD>Вот макросы — это способ сделать это не просто лучше, а почти идиально. Правда в компайлтайме, но все же.


Идеально?

FDS>>С макросами не так всё — я просто не понимаю как так можно что-то писать и я не вижу нормальной (строгой) документации по макросам.


VD>Документация есть. Зайти да nemerle.org или просто прочти статьи на нашем стайте.


Я именно их и смотрел (и там, и там). Первым делом. Но создалось впечатление, что они пытаются научить языку по примерам. Я так и не нашёл ничего похожего на спецификаию C#.

Например, где найти ответ на вопрос, как работает это:
    def F2(x: int): int -> int
    {
        def FC(y: int): int
        {
            2*y + x
        }
        FC
    }
    def F1(x: int): int
        {
                F2(x)(5)
    }
F1(5)

и работает ли вообще? Как это будет воспринято компилятором?

Или, например, я не нашёл ответ на вопрос: могу ли я во время компиляции выделить макросом кусок уже разобранного nemerle кода и выполнить с ним специфические действия (например, проверку на освобождение ресурсов или на диапазон выходных значений по заданным входным и выходным)? Могу ли я во время компиляции выполнить некоторые операции программы пользователя в штатном режиме (что-то вроде встроенного ЮТ)? [и как мне это сделать и где это описано]

Может это и есть где-то, но я не заметил

FDS>> У меня от них просто в глазах рябит (впечатление похуже, чем когда открываешь исполняемый файл в текстовом редакторе — там хоть что-то понятно).


VD>Давай конкретно. Что не понятно?


См. выше, про доступ к синтаксическому дереву.
Если я макросом генерирую другой макрос, как мне избавиться от квазицитирования, т.е. что бы компилятор не подставлял во время компиляции значение переменной Name в <[$Name]>

Почему это:
macro m(x: int)
{
    for (mutable i = x - 1; i >= 0; i--) 
    {
        <[
            System.Console.WriteLine("ss {0}", $x);
        ]>
    }
//    <[()]>
};

----
macro1.n:14:1:14:25: ←[01;31merror←[0m: in argument #2 (tl) of list[System.Objec
t-], needed a list[Nemerle.Compiler.Parsetree.PExpr.Literal-], got list[int-]: c
ommon super type of types [Nemerle.Compiler.Parsetree.PExpr.Literal, int] is jus
t `System.Object', please upcast one of the types to `System.Object' if this is
desired

даёт ошибку (приведена после черты)?

В общем, некоторые вопросы рассеялись, когда я думал, что мне непонятно конкретно. Но всё равно, ощущение такое, что макросам нехватает целостности (строгости концепции).

FDS>>Не очень понял, какие вещи нужно попытаться использовать, да ещё если они непонятны? Можно приблизительный списочек: я попытаюсь.


VD>Пожалуйста. По убыванию "прикольности".


Спасибо

VD>1. Сопоставление с образцом (в том числе и в foreach) и алгеброические типы (variant-ы).


Локальные функции круче Хотя теперь не придётся создавать массивы.

VD>2. Локальные функции.


В Delphi есть, кстати, безопаснее (хотя и менее функционально). Там, по крайней мере, нельзя написать то, что я привёл выше .
Вообще говоря, непонятно, почему они безопасностью пожертвовали ради передачи вложенных функций в вызовы другим [невложенным] функциям

VD>4. Вывод типов.

Так и не понял, что это даёт. Кроме экономии кода, конечно (кажется, это уже обсуждали на форуме?)

VD>7. Отсуствие граблей (например, оператора as).

Мне то же понравилось

VD>8. Частичное применение функций и операторов.

VD>9. Сплайсебл-строки.
Не нашёл ни 9, ни 8. Может дадите ссылку на конкретный документ?

VD>11. Бесплатная концевая рекурсия.


Не заметил, спасибо. Я думал, что они там все на функциональном программировании совсем свихнулись

VD>12. Краткий синтаксис работы со спискам и встроенные в язык списки.


А за чем они такие нужны (если их нельзя изменять)? В документации написано, что часто используются, но я так и не понял где

VD>Пунктов еще много, но уже этих более чем достаточно. Да если честно.
Re[27]: Насколько важен синтаксис языка?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.09.06 18:16
Оценка:
Здравствуйте, Beam, Вы писали:

B>Если такое сделать на Smalltalk то будет сгенерировано исключение.


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

B>Для пользователя метода ifTrue:ifFalse: даже если передать в них блок с ^ возврат будет происходить всегда предсказуемо.


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

B>Вы можете не использовать это.


Да. Я могу не использовать это и буду это не использвать, но в другом языке. В том где это невозможно использовать.

А так можно и про С сказать, что он вполне безопасен так как в нем тоже много чего можно не использовать.

B> Аналогичной функциональности можно добиться и без использования возврата из блока.


Можно. Но если такая возможность есть, то он обязательно будет использована. Причем в отличии от goto в каком-нибудь C# я не смогу запретить использование ^ так как на 1 кривой вызов будет 100 нормальных.

B> Так же как например Вы можете не писать в Java и С# return в ветке if, а дойти до конца метода и выполнить return.


return в этих языках структурных оператор.

B>Я просил привести такой пример. Без этого я не вижу смысла это обсуждать


Не видишь, не влезай в разговор. Даже смешно. Откуда эта ветка по-твоему началась?
Изучай первоисточник:
Re[6]: Насколько важен синтаксис языка?
Автор: Andrei N.Sobchuck
Дата: 05.09.06

точнее начало здесь:
Re[4]: Насколько важен синтаксис языка?
Автор: Andrei N.Sobchuck
Дата: 04.09.06
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[27]: Насколько важен синтаксис языка?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.09.06 18:16
Оценка: -3 :))
Здравствуйте, eao197, Вы писали:

VD>>Ага. А в С++ нет проблем goto, обращения к неинициализированным переменным и т.п. Достаточно послушать фанатов С++, чтобы убедиться что те у кого такие проблемы встречаются — это просто криворукие ламеры.


E>Собственно, так и есть.


Кто бы спорил. Ты один из них и есть.

VD>>Вы, поклонники Смолтока, сидите на этих комнях и упорно их не видите. Для меня это очевидные грабли. Для вас вполне нормальная вещь.


E>Грабли видят (точнее, ощущают, те, кто на них наступают). Если смолторкеры говорят, что они программируют на SmallTalk и не натыкаются на эти грабли, а ты, не программируя на SmallTalk, говоришь, что видишь эти грабли...


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

E>И при работе в Ruby я лично ни разу не видел, чтобы это стало граблями. Ни разу.


Ты много чего не видишь. Если это использовать как доказательство, то мы далеко уйдем.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: Насколько важен синтаксис языка?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.09.06 18:16
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>Тяжело вам там в .Net. В ST не работала бы только одна функция.


Да, нам, тем кто программирует не на словах, а реально действитнльно не просто. Чтобы программа заработала без ошибок при исключении приходится создавать спецальный код востановления после ошибки. Перехватывать исключения и обеспечивать непротиворечивость инварината. Иногда это просто. Иногда не очень. Иногда вообще разумнее выдать окошко и закрыть программу от греха.

Завидую я тем у кого после исключения не работает одна фукнци, а остальные этого не замечают. И все это не потому-что кто-то позаботился об обработке исключений, а просто от того что они используют чудодейственный мега язык.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Насколько важен синтаксис языка?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.09.06 18:16
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Ммм.. Нет, конечно. Но и твоя, и моя оценка субъективна.


Серьезно? Когда тебя называт ламером и недоумком, то это не нравится просто от того, что твоя оценка субъективна?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Насколько важен синтаксис языка?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.09.06 18:16
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Что за гнусные инсинуации! Разумеется, прочитал. И всё равно не оскорбился. Ну искрит время от времени, велика важность! ИМХО, с этого вреда гораздо меньше, чем с высказываний типа: "Кто не следует майнстриму, у того нет ума".


Ой, а можно ссылку на эту цитату?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Насколько важен синтаксис языка?
От: FDSC Россия consp11.github.io блог
Дата: 07.09.06 18:21
Оценка:
Здравствуйте, Turtle.BAZON.Group, Вы писали:

TBG>Здравствуйте, FDSC, Вы писали:


TBG>>>Интерпертатор и среда Emacs с настроенным SLIME (Superior Lisp Interaction Mode for Emacs)


FDS>>Ссылка не работает.


TBG>Странно. Только что проверил — работает...


Да, действительно. Правда для меня 26 мегов это слишком круто , но всё равно спасибо
Re[31]: Насколько важен синтаксис языка?
От: FDSC Россия consp11.github.io блог
Дата: 07.09.06 18:26
Оценка: +1
Здравствуйте, Beam, Вы писали:

B>Где можно ошибиться при наборе timesRepeat(10): в слове timesRepeat (синтаксическая ошибка) или в числе 10 (логическая).

B>А теперь посмотрите на кучу мест, где можно совершить ошибки в for (да, я прекрасно понимаю, что набивание таких конструкций доведено до автоматизма, но все же).

Ну, я бы сказал, что for в этом смысле просто дольше набирать. А так ведь и понимание таких отрывков доведено до автоматизма.

B>Этот пример показывает, что даже в таком простом коде имеются предпосылки к удалению дублирования.

B>В данном случае Вы убрали дублирование кода: удалили введение локальной переменной, присваивание, сравнение, увеличение переменной.

FDS>>Возможно я не понял, что именно удобно


B>Удобно то, что можно не меняя язык вводить такие конструкции как timesRepeat(number) { }

B>Разве Вы не пользовались бы таким оператором?

Таким, скорее всего, нет. Это только добавляет в код ненужную сложность, заставляя думать ещё об одном операторе. У меня в каждой функции не больше одного цикла, так что вряд ли эта конструкция сильно бы помогла.
Re[13]: Насколько важен синтаксис языка?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 07.09.06 18:27
Оценка: -4
Здравствуйте, VladD2, Вы писали:

ГВ>>Что за гнусные инсинуации! Разумеется, прочитал. И всё равно не оскорбился. Ну искрит время от времени, велика важность! ИМХО, с этого вреда гораздо меньше, чем с высказываний типа: "Кто не следует майнстриму, у того нет ума".


VD>Ой, а можно ссылку на эту цитату?


Запросто. Re[10]: ООП &mdash; перспективы
Автор: IT
Дата: 20.06.06
<< Под музыку: silent >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[27]: Насколько важен синтаксис языка?
От: FDSC Россия consp11.github.io блог
Дата: 07.09.06 18:37
Оценка:
Здравствуйте, Beam, Вы писали:

B>Здравствуйте, VladD2, Вы писали:


B>>>Представьте макрос if (cond) then {trueBlock} else {falseBlock}

B>>>Вы передаете блоки в качестве параметров макроса. Если Вы напишите return в этих блоках, будет это являться неструктурируемой передачей управления?

VD>>Несомненно, нет, не будет! Но! Я не могу передать if в другую функцию и return не приведет к выходу из другой процедуры где бы код не был бы обявлен.


B>Если такое сделать на Smalltalk то будет сгенерировано исключение.


Вы его не поняли: он имеет ввиду, не передачу функции при выходе из процедуры, а передачу функции в другую процедуру. Неструктурность заключается в том, что в Smalltalk можно выйти из переданной функции в ту функцию, где она описана. А ваш аргумент про макросы VladD2 разбил тем, что макрос не может быть передан в другую функцию. Таким образом только в Smalltalk возврат из некоторой функции может произойти не в вызывающую функцию.

VD>>То есть для пользователя мароса if возрват будет происходить всегда предсказуемо структруно.


B>Для пользователя метода ifTrue:ifFalse: даже если передать в них блок с ^ возврат будет происходить всегда предсказуемо.


B>>>Возврат из блоков в Smalltalk используется для завершения работы текущего метода (в котором описан блок) с передачей результата.


Да, а методы завершаются все, которые находятся в стеке выше, чем "текущий", который вовсе не текущий...

VD>>Вот это то и плохо. Это приводит к "замынанию управления". И это прождает не структрность и непредсказуемость. В других языках лямбды замыкаются исключительно на данные. При этом данные разделяются между контекстом замыкания и замой лямбдой, что делает код не противоричивым даже если сама лямбда будет передана в совершенно другой контест и при пройдет через тысячи функций или даже полей классов.


B>Вы можете не использовать это. Аналогичной функциональности можно добиться и без использования возврата из блока. Так же как например Вы можете не писать в Java и С# return в ветке if, а дойти до конца метода и выполнить return.


Да, но другой человек может использовать это и вам всё равно придётся следить, что бы он что-нибудь не наделал — эта возможность непрозрачна.
Re[25]: Насколько важен синтаксис языка?
От: FDSC Россия consp11.github.io блог
Дата: 07.09.06 18:39
Оценка: +2
Здравствуйте, Andrei N.Sobchuck, Вы писали:

VD>>Большинство языков намерянно не позволяют сделать этого.


ANS>Таких языков уже нету. Умерли или были пофикшены давным-давно. Хинт: механизм исключений.


Исключения генерируются тогда, когда выражение всё равно уже не может быть вычисленно. А в штатном режиме языки этого делать не позволяют
Re[27]: Насколько важен синтаксис языка?
От: FDSC Россия consp11.github.io блог
Дата: 07.09.06 18:44
Оценка:
Здравствуйте, eao197, Вы писали:


E>В Ruby, к примеру, блок кода можно создать либо через Proc.new (конструирование путем создания нового экземпляра объекта-блока), либо методом Kernel#lambda:

E>
E>block_with_nonlocal_return = Proc.new { return }
E>block_with_local_return = lambda { return }
E>

E>Блоки, созданные через Proc.new ведут себя так же, как блоки с ^ в SmallTalk (по крайней мере, насколько я понял из описаний смолтолкеров) -- применение в чужом контексте приведет к порождению исключения.

Т.е. они не могут передать возврат или исключение куда-то, кроме как в вызвавшую их функцию? Если да — то ваши аргументы некорректны, так как мы спорим о передаче управления скачком в метод, отделённый в стеке вызовов другими методами

Блоки, созданные через lambda, напротив, не прерывают работу вызвавшего их кода -- происходит возврат только из тела лямбды:
E>
E>irb(main):001:0> def sample(&block)
E>irb(main):002:1> block.call
E>irb(main):003:1> end
E>=> nil
E>irb(main):004:0> sample &Proc.new { return }
E>LocalJumpError: unexpected return
E>        from (irb):4
E>        from (irb):2:in `sample'
E>        from (irb):4
E>irb(main):005:0> sample &lambda { return }
E>=> nil
E>irb(main):006:0>
E>

E>И при работе в Ruby я лично ни разу не видел, чтобы это стало граблями. Ни разу.
Они прерывают свою работу и возвращают управление в тело вызвавшего их метода, а не метода, где они были описаны. Так?
Re[27]: Насколько важен синтаксис языка?
От: FDSC Россия consp11.github.io блог
Дата: 07.09.06 18:45
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>И хотя такая возможность есть, но реальную проблему она создаёт нечасто. Точно также и с передачей блоков кода, которые могут содержать "неожиданный возврат". Ну не надо передавать такие блоки кода — и не будет проблемы. Дисциплина-с определённая, знаете ли. Зато местами это может быть очень удобно. Просто интересная возможность сама по себе — изменить граф выполнения функции (метода) извне. Рисковано порой, вероятно, но...


В этом споре было сказано, что эта возможность применяется часто.
Re[25]: Насколько важен синтаксис языка?
От: FDSC Россия consp11.github.io блог
Дата: 07.09.06 18:46
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>Здравствуйте, VladD2, Вы писали:


VD>>Это возможно, но не элементарно.


ANS>В каком-то частном случае — возможно. В общем — нет.


Приведите мне такой случай для языка со строгой статической типизацией.
Re[21]: Насколько важен синтаксис языка?
От: FDSC Россия consp11.github.io блог
Дата: 07.09.06 18:48
Оценка: :)
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, Andrei N.Sobchuck, Вы писали:


ANS>>Здравствуйте, Курилка, Вы писали:


К>>>К примеру, что будет если блок вернуть из метода? А в блоке будет возврат из этого метода (который уже завершился)?


ANS>>Ран-тайм исключение.


К>Не вижу тогда практического смысла в этом (в нелокальных возвратах из блока) и блоки наружу передавать становится проблемно — каждый раз добавлять обработку исключений?


И куда ты добавишь обработку исключений, если вызывающий метод уже завершился? Ты нашёл ещё одну проблему.
Кстати, о ламерах
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 07.09.06 18:48
Оценка: :))) :)))
Здравствуйте, Master Yoda, Вы писали:

MY>Кстати аппеляция к понятию "ламеризм", которое не имеет четко определенной семантики [...]


Слово "ламер", если обратиться к английскому эквиваленту, будет означать "увечащий" (lame — хромой, увечный). Соответственно, ламер — это тот, кто увечит других. Например, неверными ("ламерскими") утверждениями сбивает народ с панталыку.

Ну или в русской ироничной интерпретации: ламер, это чайник, считающий себя круто заваренным.

Так что, семантика вполне определённая.
<< Под музыку: silent >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[18]: Насколько важен синтаксис языка?
От: FDSC Россия consp11.github.io блог
Дата: 07.09.06 18:51
Оценка:
Здравствуйте, Eugene Beschastnov, Вы писали:

EB>Здравствуйте, VladD2, Вы писали:


VD>>Блок без оператора "^" является классической Лямбдой с лексическим замыканием и присутствует во многих языках (в том же C#, например). А с ним является граблями ждущими своего часа.


EB>25 лет ожиданий — слегка слишком долго для граблей


Тяжёленкие такие инертные грабли....
Re[28]: Насколько важен синтаксис языка?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 07.09.06 18:53
Оценка:
Здравствуйте, FDSC, Вы писали:

ГВ>>Рисковано порой, вероятно, но...

FDS>В этом споре было сказано, что эта возможность применяется часто.

Я знаю. Значит, есть какие-то наработанные способы правильного использования такой фичи.
<< Под музыку: silent >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.