Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пн дек 17, 2018 19:55

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 40 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Пт май 18, 2007 21:43 
Не в сети
Administrator
Administrator
Аватара пользователя

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


A какое отношение вообще имеет выбор какого-то языка к случаю, когда выбор сделан изначально, и этот выбор - Форт?


yz писал(а):
Это называется универсальным алгоритмом?

Это называется, "что попросил - то и получил!" (c)...
Я не видел слова 'универсальный' в постановке вопроса.

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4956
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
мой вариант
\ 18-05-2007 ~mOleg
\ Copyright [C] 2006-2007 mOleg mininoleg@yahoo.com
\ решение задачи с конкурса открытого на форуме
\ преобазование символов табуляций в пробелы и обратно

\ -- полезные слова ---------------------------------------------------------

\ добавить число к находящемуся на стеке возвратов
: R+ ( r: a d: b --> r: a+b ) 2R> -ROT + >R >R ;

\ резервировать на HERE n байт памяти, заполнить их байтом char ?
: ALLOTFILL ( n char --> ) HERE OVER ALLOT -ROT FILL ;

\ выравнять число base на указанное значение n ?
\ граница выравнивания произвольная.
\ выравнивание производится в большую сторону
: ROUND ( n base --> n ) TUCK 1 - + OVER / * ;


0x09 CONSTANT tab_ \ код символа табуляции

\ -- формирование результирующей строки -------------------------------------

USER-VALUE buffer \ адрес временного буфера
USER-VALUE out> \ позиция с которой можно добавлять данные в буфер

20 CONSTANT tab-limit \ предельный размер табуляции

CREATE spaces_ tab-limit BL ALLOTFILL \ строка пробелов

\ добавление в буфер строки asc # к уже имеющимся
: >out ( asc # --> ) DUP IF out> SWAP 2DUP + TO out> CMOVE ELSE 2DROP THEN ;
: c>out ( char --> ) out> TUCK C! 1 CHARS + TO out> ;

\ вывести в буфер указанное кол-во пробелов
: gap ( # --> ) spaces_ SWAP tab-limit UMIN >out ;

\ получить адрес и длинну собранной в буфере строки
: result> ( --> asc # ) buffer out> OVER - ;

\ освобождение буфера
: free-result ( --> ) buffer IF buffer FREE THROW 0 TO buffer THEN ;

\ инициализация буфера
: init-buffer ( # --> )
free-result
CELLS ALLOCATE THROW
DUP TO buffer TO out> ;

\ -- преобразование табуляций в пробелы -------------------------------------

\ посчитать количество пробелов на одну табуляцию для указаной позиции
: space# ( pos tab# --> spaces )
TUCK OVER >R ROUND R> -
DUP IF NIP ELSE DROP THEN ;

\ выделить из строки подстроку, оканчивающуюся указанным символом
: piece ( src # char --> res # )
>R OVER + OVER
BEGIN 2DUP <> WHILE \ пока есть символы в строке
DUP C@ R@ <> WHILE \ пока символ не найден
1 CHARS +
REPEAT
THEN RDROP NIP OVER - ;

\ разделить строку на две подстроки по символу char
: split ( src # char --> rest # res # )
>R 2DUP R> piece TUCK 2>R - NIP 2R@ + SWAP 2R> ;

\ позиция последнего символа в выходном буфере
: pos ( --> u ) out> buffer - ;

\ преобразовать одиночную строку,
\ содержащую символы табуляции в строку с пробелами
: tabs>spaces ( src # tab# --> res # )
OVER init-buffer >R
BEGIN tab_ split >out DUP WHILE
pos R@ space# gap
SKIP1
REPEAT RDROP 2DROP result> ;

\ -- преобразование пробелов в табуляции ------------------------------------

USER inpos \ текущая позиция

\ посчитать количество пробелов от начала строки
: count-spaces ( asc # --> res # n )
0 >R OVER + SWAP
BEGIN 2DUP <> WHILE \ пока не конец строки
DUP C@ BL = WHILE \ пока пробелы
1 R+ 1 CHARS +
REPEAT
THEN TUCK - R> ;

\ преобразовать пробелы, если возможно в табуляции
: convert-spaces ( pos n tab# --> )
>R BEGIN DUP WHILE
OVER R@ space# 2DUP < 0= WHILE
DUP inpos +!
TUCK - >R + R>
tab_ c>out
REPEAT SWAP DUP inpos +! gap
THEN RDROP 2DROP ;

\ преобразовать одиночную строку src #, содержащую пробелы
\ в строку содержащую табуляции вместо подходящих длинных
\ последовательностей пробелов.
: spaces>tabs ( src # tab# --> res # )
OVER init-buffer >R 0 inpos !
BEGIN BL split DUP inpos +! >out DUP WHILE
count-spaces inpos @
SWAP R@ convert-spaces
REPEAT RDROP 2DROP result> ;

\ EOF -- тестовая секция ----------------------------------------------------

\ загрузить содержимое файла в буффер
: source ( FileName # --> addr # )
R/O OPEN-FILE THROW >R
R@ FILE-SIZE THROW DROP
DUP ALLOCATE THROW
TUCK SWAP R@ READ-FILE THROW
R> CLOSE-FILE THROW ;

S" sample.txt" source \ любой однострочный текст
2DUP TYPE 2DUP DUMP CR
8 tabs>spaces 2DUP TYPE 2DUP DUMP CR
8 spaces>tabs 2DUP TYPE DUMP CR


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6454
Благодарил (а): 14 раз.
Поблагодарили: 101 раз.
yz писал(а):
Хищник писал(а):
Иначе получится сборная солянка из языков, каждый из которых умеет что-то делать очень хорошо.

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


Ну, вот сейчас /me нечто подобное и делает :) Просто искать наиболее подходящий язык для каждой функции чисто из спортивно-религиозного интереса.... :shuffle;


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4956
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
yz писал(а):
Задачи такого рода элементарно решаются на специальном языке, заточенном под обработку строк, например, на Перле, и крайне извращенно решаются на Форте.
Непонятно, почему бы не взять удобный инструмент?


Я не понял, в чем проблема?
Задачка реальная и достаточно простая - тут один товарищь говорил, что вообще не стоит столь простую задачу публиковать, так как ну уж слишком она простая 8)

Я лично решал в лоб, и не долго мучился. Мой код уже работает в другом месте, куда меня это дело уже давно просили вставить 8)


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

a) б)
Я конечно, немного извиняюсь. Но и в первом, и во втором примерах промежуточные строки в памяти создаются и снимаются "автоматом". А теперь найдите в обоих кодах хоть намёк на ALLOCATE или FREE, их нет, только в первом примере, и из-за постановки задачи пришлось HEAP-COPY применить. Управление памятью в обоих случаях там спрятано в "обёртках", которые собственно для того и писались (в том числе и мной).

в) Первый пример немножко на бэкфорте написан.

г) Второй пример немножко на конечных автоматах сделан.


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

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

Не из спортивного, а из педагогического. Я понимаю, что и постановка задачи, и ее решение должны быть образцовыми.


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

Зарегистрирован: Сб янв 27, 2007 22:00
Сообщения: 106
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
WingLion писал(а):
Это называется, "что попросил - то и получил!" (c)...
Я не видел слова 'универсальный' в постановке вопроса.

Не надо снова съезжать с темы в дешевые хохмы.
Если, по-вашему, все задачи имеют решение, прошу предоставить решение и той, что написал я. Или признайте, что ваше утверждение ложно.


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

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

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


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

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


A смысл этого признания есть, если вы юмора не понимать?

Да, я прекрасно осознавал, когда писал,
что моя фраза про "все задачи имеют решение" - неверна.
хотя, подразумевалось "все задачи предложенные на данном конкурсе".

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4956
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
yz писал(а):
Я лично решал в лоб, и не долго мучился.

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


8) а откуда взялось такое впечатление?
На самом деле там как раз построчно. Просто файл может состоять из одной строки 8)


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6454
Благодарил (а): 14 раз.
Поблагодарили: 101 раз.
yz писал(а):
Не из спортивного, а из педагогического. Я понимаю, что и постановка задачи, и ее решение должны быть образцовыми.

Для тренировки навыков это подойдет. Но для целостного понимания проблем разработки - не очень. Новый язык - это совершенно объективное время на его освоение, затраты на приобретение, косвенные затраты на интеграцию. Почему-то слова "я не знаю языка XXX" вызывают реакцию "так иди и изучи!", а не "хм, да, извините, что предложили вариант, который потребует дополнительного повышения квалификации".


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: преобразование табуляций в тексте
СообщениеДобавлено: Ср июн 03, 2009 18:51 
Если я правильно понял, речь идет о преобразовании одного объекта - точки Line в другой - фрагмент Cell.
Может я ошибаюсь, но стандартными средствами этого сделать нельзя.
Какой в этом смысл? Не проще просто поставить новый фрагмент на эту точку?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re:
СообщениеДобавлено: Вт мар 15, 2011 03:52 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 521
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 22 раз.
yz писал(а):
WingLion писал(а):
Все задачи имеют решение.

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

Универсальное решение :
Код:
: ?ALGO_STOP ( addr len -- ) \ addr - адрес текста алгоритма, len - его длина
  ." Останавливается. "
  EVALUATE
  ." Нет, ошибся ! Ни хрена не останавливается !"
;
:))


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

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
А вот так правильно
Код:
: ?ALGO_STOP ( addr len -- ) \ addr - адрес текста алгоритма, len - его длина
  ." Не знаю, ждите... "
  EVALUATE
  ." Останавливается !"
;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование табуляций в тексте
СообщениеДобавлено: Пн июл 25, 2011 02:56 
Тогда не ответил, сейчас отвечу.

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

Тогда в моем понимании :
Если возврата из EVALUATE нет, то алгоритм остановился, ибо завис (например, впав в бесконечный цикл). Если возврат есть, то алгоритм не остановился, ибо не завис и успешно завершился.

В понимании dynamic-wind :
Если возврата из EVALUATE нет, то алгоритм не остановился ибо ещё продолжает что-то считать. Если возврат есть, то алгоритм остановился ибо завершил свою работу.

Мораль :
А формулируйте-ка условия задач так, чтобы их нельзя было понять ИНАЧЕ.


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

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


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

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


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

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