Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб дек 16, 2017 01:41

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 405 ]  На страницу Пред.  1 ... 22, 23, 24, 25, 26, 27  След.
Автор Сообщение
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 15:52 
Не в сети

Зарегистрирован: Пт май 12, 2006 23:42
Сообщения: 300
Откуда: Kиев
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
true-grue писал(а):
Но Ваша точка зрения, не признавать _ничего_, кроме locals, мне непонятна.

Телепат? Может еще чего расскажете о МОЕЙ ТОЧКЕ ЗРЕНИЯ - мне самому интересно? :?
true-grue писал(а):
Чем моя конструкция помешает лично Вам?

Она мне мешает?
true-grue писал(а):
ArtemKAD писал(а):
И что поменялось? Ввели еще одно правило не убрав суть.

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

Вот это самое принуждение без существенных преимуществ и не даст в дальнейшем ею пользоваться.
ЗЫ. Суть неудобства/проблемы.

true-grue писал(а):
Я не помню точной хронологии изобретений г-на chess'а, но он уже давно пришел к варианту "3\1231".

Возможно и отстал... Хорошо, пусть будет такой вариант.
Вот только дальше любопытнее... Вот это отличный вариант - простой, наглядный и функциональный как все DUP,DROP,SWAP,ROT,NIP вместе взятые, но на это надо остановиться. Иначе из трех преимуществ останется только одно. Не стоит дальше этот простой молоток превращать в ЧПУ-станок т.к. молотком может воспользоваться каждый, а вот ЧПУ требует длительного обучения... А с учетом того, что любители ЧПУ предпочитаю не Форт, а чего посерьезней, тут оно не приживется.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 16:24 
Не в сети

Зарегистрирован: Пн ноя 05, 2007 13:54
Сообщения: 121
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Давайте проследим историю "конфликта".

Исходный вариант от dynamic-wind.
Код:
: appIf ( predxt opxt array --)
  each: dup где-чёртов-predxt pick execute
     if где-чёртов-opxt pick execute else drop then ;


Манипуляторы.
Код:
: appIf ( pred op array)
   each: 3\12331 execute
   if  3\1232 execute else drop then ;

Понятно, что можно сделать еще "манипуляторнее", но идея и так ясна.

Мой вариант.
Код:
: appIf ( pred op array)
   each: { pred op element - .. element pred} execute
   if { pred op element - .. op} execute else drop then ;


Локальные переменные.
Код:
Решение не было предложено. Если кое-кто захочет дать решение, пусть не забудет заодно и про count>.


Если для кого-то краткость программы -- самое главное, есть манипуляторы. Для меня же это write-only код. Поэтому я и предложил свой вариант. По моему опыту, в долгосрочной перспективе наиболее окупаются те языковые решения, которые принуждают программиста к ясности и порядку. Простой пример -- отступы в Python. Уж сколько ругались на эти отступы! Но то, что в результате программа, во многом, выглядит, как псевдокод, дорогого стоит.
А слова про "неудобства/проблемы" и "не даст в дальнейшем ею пользоваться" -- чушь. Генератор стековых перестановок -- такая же старая идея в Форте, как и те же локальные переменные. Разные вариации этой идеи присутствуют и в других форт-подобных языках. Если же Вы, ArtemKAD, говорили о себе и своем личном нежелании пользоваться этой конструкцией, то добавляйте "imho". Мне этого будет вполне достаточно. Лично Вас агитировать использовать эту конструкцию я с самого начала не собирался.


Последний раз редактировалось true-grue Сб дек 29, 2012 17:53, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 16:41 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
mOleg писал(а):
я пока вот вижу одно полезное применение подобного механизма, если он позволит легко описывать базовые операции (примитивы) для вновь создаваемой форт-системы. Это было бы очень полезно, не залазя в дебри опкодов процессора описывать базовые понятия.

а сам этот механизм без опкодов как запускать в новой форт-системе?

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 16:53 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6100
Благодарил (а): 14 раз.
Поблагодарили: 96 раз.
ArtemKAD писал(а):
А это надо? Насколько помню ни одна из команд манипулирующих стеком не добавляет туда числа. Ведь там где число, там должно быть и слово. А тогда что прикажете делать если слова a b c уже существуют - a b c это тогда манипуляция стеком или вызов уже существующего слова??? Может не стоит превращать хорошую (и главное - простую) идею снова в монстра как это получилось у chess ?

Внутри скобок - манипуляция стеком. Слова Форта обычно пишутся в верхнем регистре или в Java-стиле ("СловоМоейПрограммы"). По поводу добавления чисел - мы ради удобства делаем расширения или для добавления неких абстрактных пунктов в список features? Да, манипуляции стеком, а конкретно - приведение стека в нужный вид, являются одной из важных задач в Форте, которая потенциально вызывает проблемы при отладке программ. Устранять проблемы можно разными способами, но эти способы должны разгружать программиста, а не стягивать на себя дополнительное внимание.

ArtemKAD писал(а):
И в английском не говорят. Говорящие только DUP DROP и SWAP (за что ИМХО и используются больше остальных). Остальные более чем спорны.

Именно так. Что красиво выглядит, то и используется. Значит, надо делать красиво выглядящим, а не эффектным внутри.
ArtemKAD писал(а):
Для следующей подобной, но не такой перестановки будет это-же слово или придумаете другое ?

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 18:58 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4832
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 52 раз.
WingLion писал(а):
а сам этот механизм без опкодов как запускать в новой форт-системе?

понятия не имею 8)
но, согласись, что, если бы можно было начать написание новой системы с:

: DUP { n1 --> n1 n1 } ;
: DROP { n1 --> } ;
: SWAP ( n1 n2 --> n2 n1 } ;

то было бы очень удобно.
т.е. подобный механизм создания примитивов без погружения в новый ассемблер и прочие прелести 8)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 19:03 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
mOleg писал(а):
то было бы очень удобно.
т.е. подобный механизм создания примитивов без погружения в новый ассемблер и прочие прелести

да, конечно... но это та похоже на сказочное "горшочек, вари!", что выглядит как мечта о невозможном

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 19:42 
Не в сети

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 231
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
предлагаю для разделение частей при неизменном стеке использовать ==
а слово .. задействовать как предлагал true-grue. то есть .. извлекает весь входной кадр, правильно?

Код:
S" sm.f" INCLUDED
CREATE buf 640 ALLOT   VARIABLE wrd   VARIABLE sym 

: sym+ ( char -- ) buf C@ 1+ DUP buf C! buf + C! ;
: wrd! ( a u -- ) wrd @ 1+ wrd ! buf wrd @ 64 * + 2DUP C! 1+ SWAP CMOVE ;
: <..>  ( a u -- ) S" .." COMPARE 0= IF wrd @ 1+ 1 ?DO I 48 + sym+ LOOP THEN ;
: fnd! ( a u -- ) wrd @ 1+ 1 ?DO 2DUP I 64 * buf + DUP C@ 1 0 D+ COMPARE 0= IF I 48 + sym+ LEAVE THEN LOOP <..> ;
: mid? ( a u -- a u ? ) 2DUP 2DUP S" -" COMPARE -ROT S" ==" COMPARE AND ;
: <NextWord> ( -- a u ) BEGIN NextWord DUP 0= WHILE DROP 2DROP REFILL REPEAT ;

: {      ( === преобразавать текст внутри  { ..... } в стековый манипулятор === )       

  buf 640 BL FILL 0 wrd ! 2 buf C!
  BEGIN <NextWord> mid? WHILE wrd! REPEAT NIP
  1 = IF [CHAR] \ ELSE [CHAR] | THEN buf 2+ C! wrd @ 48 + buf 1+ C!
  BEGIN <NextWord> 2DUP S" }" COMPARE WHILE fnd! REPEAT 2DROP
  buf COUNT S" NOTFOUND" SFIND DROP EXECUTE
; IMMEDIATE

: 2dup_1 { a b - .. .. } ;
: 2dup_2 { a b == .. } ;

: test1 1 2 2dup_1 ;
\ результат test1 ( 1 2 1 2 )

: test2 1 2 2dup_2 ;
\ результат test2 ( 1 2 1 2 )

: 3dup { a b c == .. } ;
: test3 1 2 3 3dup ;
\ результат test3 ( 1 2 3 1 2 3 )



Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 19:59 
Не в сети

Зарегистрирован: Пн ноя 05, 2007 13:54
Сообщения: 121
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Alex писал(а):
предлагаю для разделение частей при неизменном стеке использовать ==
а слово .. задействовать как предлагал true-grue. то есть .. извлекает весь входной кадр, правильно?


Я думаю, Вы и сами видите, что таким образом мы запутываем читающего нашу нотацию разработчика. Я понимаю, что == пришлось ввести для более эффективной компиляции в манипуляторы, но при этом мы теряем смысл надстройки: простая и вполне читаемая нотация начинает обрастать разнообразными вариантами, правилами пользования, нюансами...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 20:01 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2095
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 34 раз.
true-grue писал(а):
Если для кого-то краткость программы -- самое главное, есть манипуляторы. Для меня же это write-only код.

Манипуляторы это write-only код? Write-only код это программы на J. А у вас иллюзии.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 20:10 
Не в сети

Зарегистрирован: Пн ноя 05, 2007 13:54
Сообщения: 121
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
chess писал(а):
true-grue писал(а):
Если для кого-то краткость программы -- самое главное, есть манипуляторы. Для меня же это write-only код.

Манипуляторы это write-only код? Write-only код это программы на J. А у вас иллюзии.


А программист на J обругал бы Вас и добавил, мол, даже не смейте сравнивать эти свои жалкие манипуляторы "от сохи" с красивой математической нотацией!

А программист на одном из популярных языков с недоумением бы выразился в том смысле, что для него и разницы нет, что APL, что Forth -- не синтаксис, а сплошные помехи на линии.

Манипуляторы Ваши, ув. chess, только ленивый еще не обругал. А Вы все сражаетесь с ветряными мельницами :)



За это сообщение автора true-grue поблагодарил: dynamic-wind
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 20:24 
Не в сети

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 231
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
ну да правильно, если надо сохранить стек, просто пишем после разделителя - слово ..
Код:
S" sm.f" INCLUDED
CREATE buf 640 ALLOT   VARIABLE wrd   VARIABLE sym 

: sym+ ( char -- ) buf C@ 1+ DUP buf C! buf + C! ;
: wrd! ( a u -- ) wrd @ 1+ wrd ! buf wrd @ 64 * + 2DUP C! 1+ SWAP CMOVE ;
: <..>  ( a u -- ) S" .." COMPARE 0= IF wrd @ 1+ 1 ?DO I 48 + sym+ LOOP THEN ;
: fnd! ( a u -- ) wrd @ 1+ 1 ?DO 2DUP I 64 * buf + DUP C@ 1 0 D+ COMPARE 0= IF I 48 + sym+ LEAVE THEN LOOP <..> ;
: <NextWord> ( -- a u ) BEGIN NextWord DUP 0= WHILE DROP 2DROP REFILL REPEAT ;

: {      ( === преобразавать текст внутри  { ..... } в стековый манипулятор === )       
  buf 640 BL FILL 0 wrd ! 2 buf C! [CHAR] \ buf 2+ C!
  BEGIN <NextWord> 2DUP S" -" COMPARE WHILE wrd! REPEAT 2DROP  wrd @ 48 + buf 1+ C!
  BEGIN <NextWord> 2DUP S" }" COMPARE WHILE fnd! REPEAT 2DROP  buf COUNT S" NOTFOUND" SFIND DROP EXECUTE
; IMMEDIATE

: 2dup { a b - .. .. } ;
: test1 1 2 2dup ;
\ результат test1 ( 1 2 1 2 )

: 3noop { a b c - .. } ;
: test2 1 2 3 3noop ;
\ результат test2 ( 1 2 3 )


Последний раз редактировалось Alex Вс дек 30, 2012 11:47, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 20:50 
Не в сети

Зарегистрирован: Пт май 12, 2006 23:42
Сообщения: 300
Откуда: Kиев
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
true-grue писал(а):
Давайте проследим историю "конфликта".

Исходный вариант от dynamic-wind.
Код:
: appIf ( predxt opxt array --)
  each: dup где-чёртов-predxt pick execute
     if где-чёртов-opxt pick execute else drop then ;


Манипуляторы.
Код:
: appIf ( pred op array)
   each: 3\12331 execute
   if  3\1232 execute else drop then ;

Понятно, что можно сделать еще "манипуляторнее", но идея и так ясна.

Мой вариант.
Код:
: appIf ( pred op array)
   each: { pred op element - .. element pred} execute
   if { pred op element - .. op} execute else drop then ;


Локальные переменные.
Код:
Решение не было предложено.

Так и быть, если желаете:
Код:
: runIf { pred op element -- pred op }
     element pred execute
   if element op execute then
  pred op ;
: appIf ( pred op array -- )
   each: runIf ;


true-grue писал(а):
Если для кого-то краткость программы -- самое главное, есть манипуляторы. Для меня же это write-only код.

Не знаю какой там "write-only", но для того, что-бы понять что конкретно происходит со стеком в конкретно этом примере я использовал именно вариант с манипуляторами - для меня там нагляднее .


true-grue писал(а):
Разные вариации этой идеи присутствуют и в других форт-подобных языках. Если же Вы, ArtemKAD, говорили о себе и своем личном нежелании пользоваться этой конструкцией, то добавляйте "imho". Мне этого будет вполне достаточно. Лично Вас агитировать использовать эту конструкцию я с самого начала не собирался.

Ну что-ж - время покажет. ИМХО простейший вариант манипулятора в Форте очень вероятно, что приживется. А вот скобочная именная перестановка - очень сильно сомневаюсь.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 21:14 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2095
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 34 раз.
true-grue писал(а):
Манипуляторы Ваши, ув. chess, только ленивый еще не обругал. А Вы все сражаетесь с ветряными мельницами

Их как раз только ленивые и обругали(по-вашему это ветряные мельницы). Те кто не удосужились разобраться с достаточно примитивным технологическим приемом конверсии сложности одного вида в другой(сложность при этом не меняется в количественном выражении), более подходящий для восприятия программистом. Это не всегда возможно, и как говорил Хокинг, сложность будущих задач не сможет быть преодолена только людьми, понадобится связка человека с машиной.
Насчет J - засилье восприятия программы при сознательно усиленной зависимости(авторами) от текущего контекста, напрягает уже и в общении на естественном языке( отсюда терминологические споры, ошибки восприятия от неверно впитанного текущего контекста и все такое прочее ).

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Сб дек 29, 2012 23:24 
Не в сети
Аватара пользователя

Зарегистрирован: Пт апр 13, 2012 11:57
Сообщения: 142
Благодарил (а): 3 раз.
Поблагодарили: 0 раз.
true-grue писал(а):
Манипуляторы Ваши, ув. chess, только ленивый еще не обругал. А Вы все сражаетесь с ветряными мельницами :)

+1
Да, блевонтина редкостная (пожалуй, я бы высказался значительно крепче, но у нас же не имиджборд).
Впрочем, я бы с удовольствием ещё послушал мантры этого унылого пассажира о том, что все кругом живут в иллюзии - это немало забавляет. С другой стороны, может это такой хитроумный pr? Типа штурмовая атака в поисках сторонников с гимном "ветер в лицо, но я всё равно иду"... )

_________________
Дейкстраординарный


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: расширенные операторами стековые манипуляторы
СообщениеДобавлено: Вс дек 30, 2012 01:54 
Не в сети

Зарегистрирован: Пт май 12, 2006 23:42
Сообщения: 300
Откуда: Kиев
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Zinger писал(а):
true-grue писал(а):
Манипуляторы Ваши, ув. chess, только ленивый еще не обругал. А Вы все сражаетесь с ветряными мельницами :)

+1
Да, блевонтина редкостная (пожалуй, я бы высказался значительно крепче, но у нас же не имиджборд).
Впрочем, я бы с удовольствием ещё послушал мантры этого унылого пассажира о том, что все кругом живут в иллюзии - это немало забавляет.

А давайте я Вам эти мантры пропою. Только не о том монстре что получился, а о изначальной идее откуда он родился и которая все еще является его составляющей.
А идея проста:
Очень часто в Форте приходится делать вподряд несколько операций над содержимым стека с одной единственной целью - вытащить из глубины стека на вершину стека одну или несколько ячеек для того, что-бы скормить их некоему слову. Обычно это выглядит а-ля так:
R> ROT DUP
Тут еще и стек возвратов использовался как временно хранилище(костыль) для некоего параметра который иначе из под вороха сверху накладенного очень весело было-бы доставать.
Смысл всех этих операций - из некоего текущего стекового кадра так перетасовать параметры, что-бы получить другой, требуемый здесь и сейчас. Т.е. к примеру надо сделать операцию над стеком единственный результат которой выглядит так
( a b c -- a b c a b ) или если вместо букв написать цифрами ( 1 2 3 -- 1 2 3 1 2 )
Исходное состояние стека записывается всегда в одном порядке который определяется исключительно числом элементов начального стекового кадра которые мы собрались переставлять. Поэтому если записать вместо 1 2 3 просто 3 понимая под этой цифрой только число начальных элементов суть сильно не изменится
( 3 -- 1 2 3 1 2 )
Так понятно записано? Понятно, что это записано изначальное желание - еще до того, как начать думать какими из имеющихся перестановок его можно сделать мы желаем получить имеенно такой результат => вытащить два числа из под вершины стека - типовой пример для операции сравнения по результатам которой надо что-то сделать с тремя оставшимися параметрами.

Это была призказка :) ... А теперь суть идеи - а давайте вместо того, что-бы думать какими существующими перестановками сделать желаемое, запишем это желание сразу одним словом которое это желание и совершит.

У chess-манипуляторов для выше приведенного примера выглядит буквально выбрасыванием всего лишнего:
3/12312

Надеюсь что означает такая запись и почему она именно такая понятно?

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

ЗЫ. Ну а дальше chess понесло - он решил отказаться от "простой, логичный, понятный" сосредоточившись на "мощный". Результат, как говорится, на лице. :hey;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 405 ]  На страницу Пред.  1 ... 22, 23, 24, 25, 26, 27  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB