Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 13:13

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 40 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: *преобразование табуляций в тексте
СообщениеДобавлено: Чт май 17, 2007 11:33 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Следующая задачка для конкурса
Преобразовать текст таким образом, чтобы все табуляции в тексте были
заменены на пробелы. Исходный текст не должен быть изменен. Количество
пробелов добавляемых символом табуляции, во-первых, зависит от tab# -
получаемого в качестве параметра, и, во-вторых, от позиции в которой
находится символ табуляции (код 0x09), так как табуляция перемещает
следующий за ней символ в позицию кратную величине tab#.

\ на входе строка текста, содержащая пробелы src #
\ и число, определяющее длину табуляции
\ на выходе результирующая строка с табуляциями
: tabs>spaces ( src # tab# --> res # )

;

И сразу обратную задачу spaces>tabs заменяющая лишние пробелы на
табуляции при возможности. Правила те же, что и для первой задачи.

: spaces>tabs ( src # tab# --> res # )

;


Последний раз редактировалось mOleg Чт мар 20, 2008 16:33, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 18, 2007 10:41 
Код:
\ К конкурсу решения задач на форте (http://fforum.winglion.ru/viewtopic.php?p=7587#7587)

\ Замена табуляторов на пробелы
\ Первый пример (см. после слова /TEST ) -- просто строка
\ Второй -- требует наличия текстового файла in.txt с текстом


\ Для запуска нужен дистрибутив SPF:
\ http://sourceforge.net/project/showfiles.php?group_id=17919

\ И апрельское обновление:
\ http://sourceforge.net/project/shownotes.php?release_id=497972&group_id=17919

REQUIRE /TEST ~profit/lib/testing.f
REQUIRE HEAP-COPY ~ac/lib/ns/heap-copy.f
REQUIRE FILE ~ac/lib/str5.f
REQUIRE split ~profit/lib/bac4th-str.f
REQUIRE LOCAL ~profit/lib/static.f

: COPY-ARR ( addr1 u1 -- addr2 u2 ) DUP >R HEAP-COPY R> ;


: tabs>spaces ( addr1 u1 n -- addr2 u2 )
LOCAL tabs tabs !
LOCAL res-addr
LOCAL res-len

START{
concat{ byRows split notEmpty DUP STR@ \ режем строку по переводам строки
concat{ 9 byChar split \ режем строку по табуляторам
*> <*> \ оператор "вилка" -- сначала подаёт одну строку отрезанную по табуляторам
\ а потом подаёт строку составленную из пробелов нужных для доведения до позиции табуляции
concat{ \ цикл конкатенации нужного кол-ва пробелов
START{ PRO DUP STR@ NIP \ длина только что данной строки отрезанной по табуляторам
tabs @ MOD tabs @ SWAP - \ определяем нужное кол-во пробелов
0 ?DO S"  " CONT LOOP }EMERGE \ генерируем пробелы столько-то раз
}concat \ все пробелы слили в одну строку
<* DUP STR@ ( addr u ) }concat DUP STR@ \ обработали одну строку: сцепили все куски: отрезок-пробелы-отрезок-пробелы-...
\ и снова вилка: сначала подаём строку, потом -- перевод строки
*> <*> LT LTL @ <* }concat DUP STR@ \ сцепляем всё вместе
COPY-ARR res-len ! res-addr ! }EMERGE \ копируем в кучу
\ Конструкция concat{  }concat по окончании работы убирает лишние отрезки памяти, поэтому копировать нужно явно
res-addr @ res-len @ ;

\ Изначальный код без комментариев:
\ : tabs>spaces ( addr1 u1 n -- addr2 u2 )
\ LOCAL tabs tabs !
\ LOCAL res-addr
\ LOCAL res-len

\ START{
\ concat{ byRows split notEmpty DUP STR@
\ concat{ 9 byChar split
\ *> <*>
\ concat{ START{ PRO DUP STR@ NIP tabs @ MOD tabs @ SWAP - 0 ?DO S"  " CONT LOOP }EMERGE }concat
\ <* DUP STR@ ( addr u ) }concat DUP STR@ *> <*> LT LTL @ <* }concat DUP STR@
\ COPY-ARR res-len ! res-addr ! }EMERGE
\ res-addr @ res-len @ ;

/TEST
"    ab   beac   core d
   def   eres   f"
STR@ 7 tabs>spaces TYPE

CR CR

S" in.txt" FILE 7 tabs>spaces TYPE


Хм. В коде что-то многовато стеко-строкового шума в лице "DUP STR@", надо с этим что-нибудь посмотреть... Возможно, стоит сделать split'ы сразу получающие на вход строки ~ac/lib/str5.f.

Вторая подзадача представляется неверной по цели. Табулятор -- это не n пробелов. Преобразование табулятора в пробелы -- это понижение качества оформления текста, то есть он становится менее гибким к изменениям. Обратное преобразование пусть и можно сделать но там уже совсем необратимые косяки появляются (становится невозможно отличить от табулятора просто группу пробелов, как перед центрованным заголовком например). То есть:

Код:
    табулятор    табулятор    табулятор    табулятор
            |            |            |            |
   И молвила рыбка: "что тебе надобно, старче"


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


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 18, 2007 11:12 
Не в сети

Зарегистрирован: Сб янв 27, 2007 22:00
Сообщения: 106
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Задачи такого рода элементарно решаются на специальном языке, заточенном под обработку строк, например, на Перле, и крайне извращенно решаются на Форте.
Непонятно, почему бы не взять удобный инструмент?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 18, 2007 11:24 
Не в сети
Administrator
Administrator
Аватара пользователя

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


Все задачи имеют решение.
Почему надо не лежать на печи и не плевать в потолок, приговаривая
"если я ничего не решу, то кто-нибудь, что-нибудь да решит"?

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 18, 2007 12:50 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
yz писал(а):
Задачи такого рода элементарно решаются на специальном языке, заточенном под обработку строк, например, на Перле, и крайне извращенно решаются на Форте.
Непонятно, почему бы не взять удобный инструмент?

Так может, на этих задачах и определим, как расширить Форт до этого "специального языка"? :)

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 18, 2007 12:55 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
profiT писал(а):
Здесь "рыбка" и "старче" попадают на позиции табуляции (в том смысле что по логике можно заменить стоящие перед словами пробелы на табуляции). А не проверять единичные пробелы на выровненность по табуляции -- нельзя, так как оформление может привести и к табуляциям, равным только одной позиции.

Похоже, получаются 2 разные задачи:
- привести к удобному для поиска виду (табуляция==1 пробел -> 1 пробел)
- сохранить форматирование (табуляция==1 пробел -> табуляция)

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 18, 2007 13:06 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
yz писал(а):
Задачи такого рода элементарно решаются на специальном языке, заточенном под обработку строк, например, на Перле, и крайне извращенно решаются на Форте.
Непонятно, почему бы не взять удобный инструмент?

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 18, 2007 15:40 
yz писал(а):
Задачи такого рода элементарно решаются на специальном языке, заточенном под обработку строк, например, на Перле, и крайне извращенно решаются на Форте.
Непонятно, почему бы не взять удобный инструмент?


А по-моему, эту (ещё одну от меня) реализацию на автоматах немножко нельзя назвать "крайне извращённой":
Код:
\ К конкурсу решения задач на форте (http://fforum.winglion.ru/viewtopic.php?p=7587#7587)

\ Замена табуляторов на пробелы-2
\ Первый пример (см. после слова /TEST ) -- просто строка
\ Второй -- требует наличия текстового файла in.txt с текстом


\ Для запуска нужен дистрибутив SPF:
\ http://sourceforge.net/project/showfiles.php?group_id=17919

\ И апрельское обновление:
\ http://sourceforge.net/project/shownotes.php?release_id=497972&group_id=17919

REQUIRE /TEST ~profit/lib/testing.f
REQUIRE состояние ~profit/lib/chartable.f
REQUIRE (: ~yz/lib/inline.f
REQUIRE FILE ~ac/lib/str5.f
REQUIRE TYPE>STR ~ygrek/lib/typestr.f

MODULE: tabsspaces2

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

VARIABLE ширина-табулятора

EXPORT

состояние убрать-табуляторы
на-входе:  отсюда начать-копить ; \ делаем отметку

все:  копить-дальше ;

перевод-строки:
накопленный-текст 2@ TYPE CR
убрать-табуляторы ;

9 asc:
накопленный-текст запомнить
накопленный-текст 2@ TYPE
накопленный-текст длина ширина-табулятора @ TUCK MOD - SPACES
убрать-табуляторы ;

строка-кончилась: накопленный-текст запомнить  накопленный-текст 2@ TYPE ;


: tabs>spaces ( addr1 u1 n -- addr2 u2 )
ширина-табулятора !

1 TO размер-символа SWAP поставить-курсор
(: убрать-табуляторы -символов-обработать ;) TYPE>STR STR@ ;

;MODULE


/TEST
"    ab   beac   core d
   def   eres   f"
STR@ 7 tabs>spaces TYPE

CR CR

S" in.txt" FILE 7 tabs>spaces TYPE


Последний раз редактировалось profiT Пт май 18, 2007 15:46, всего редактировалось 1 раз.

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 18, 2007 15:46 
Вынужден проинформировать что форум сам сделал эту задачу в обоих программках. Из-за чего примерные строки с табуляторами позаменялись на пробелы.

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


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 18, 2007 20:53 
Не в сети

Зарегистрирован: Сб янв 27, 2007 22:00
Сообщения: 106
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
WingLion писал(а):
Все задачи имеют решение.

А все языки эквивалентны машине Тьюринга. Зачем вам нужен Форт? Пишите на бесконечной ленте.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 18, 2007 21:02 
Не в сети

Зарегистрирован: Сб янв 27, 2007 22:00
Сообщения: 106
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
in4 писал(а):
Так может, на этих задачах и определим, как расширить Форт до этого "специального языка"? :)

Это и без задач понятно. Нужны

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

Каждый из пунктов несколько выходит за рамки небольшой конкурсной задачи.
На www.forth.org.ru где-то в новостях была ссылка на работу с описанием реализации всех этих вещей на Форте.

Чтобы не быть неправильно понятым: я призываю ответственнее подходить к выбору задач и искать такие, для которых подходит именно Форт.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 18, 2007 21:05 
Не в сети

Зарегистрирован: Сб янв 27, 2007 22:00
Сообщения: 106
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Хищник писал(а):
Иначе получится сборная солянка из языков, каждый из которых умеет что-то делать очень хорошо.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 18, 2007 21:06 
Не в сети

Зарегистрирован: Сб янв 27, 2007 22:00
Сообщения: 106
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
WingLion писал(а):
Все задачи имеют решение.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 18, 2007 21:18 
Не в сети
Administrator
Administrator
Аватара пользователя

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

Ну, так вперед! А я за Вами.
Мы грудью постоим за Родину свою... за Вашими спинами.

yz писал(а):
Ну вот вам задача: составить алгоритм, определяющий, останавливается ли данный конкретный алгоритм.


Да, легко! :)
: ха-ха BEGIN ." Этот алгоритм не остановится!" CR AGAIN ;

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 18, 2007 21:32 
Не в сети

Зарегистрирован: Сб янв 27, 2007 22:00
Сообщения: 106
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
WingLion писал(а):
Ну, так вперед! А я за Вами.
Мы грудью постоим за Родину свою... за Вашими спинами.

Какое отношение эти хохмы имеют к рассматриваемому вопросу выбора языка для конкретной задачи?

yz писал(а):
Ну вот вам задача: составить алгоритм, определяющий, останавливается ли данный конкретный алгоритм.

Цитата:
Да, легко! :)
: ха-ха BEGIN ." Этот алгоритм не остановится!" CR AGAIN ;

Это называется универсальным алгоритмом?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 40 ]  На страницу 1, 2, 3  След.

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


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

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


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

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