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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 536 ]  На страницу Пред.  1 ... 29, 30, 31, 32, 33, 34, 35, 36  След.
Автор Сообщение
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Чт янв 25, 2018 17:59 
<Потерто по справедливому замечанию Victor__v>


Последний раз редактировалось gudleifr Сб янв 27, 2018 14:56, всего редактировалось 1 раз.

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Чт янв 25, 2018 19:18 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1285
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
gudleifr писал(а):
Victor__v писал(а):
допиши свой форт сделай так, чтобы в нём багов не было.
А уж потом мы и парсинг, оптимизацию, логику ( нужное выбрать ) обсудим
Спасибо! Понес к себе в список дебилизмов.

Я так и знал что найдётся ценитель :D

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Чт янв 25, 2018 19:28 
<Потерто по справедливому замечанию Victor__v>


Последний раз редактировалось gudleifr Сб янв 27, 2018 14:56, всего редактировалось 1 раз.

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Чт янв 25, 2018 21:07 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
_KROL писал(а):
?DUP IF 2DUP 0 AND EXIT THEN \ sz==0?
Во первых
2DUP 0 AND
это просто
OVER 0
Во вторых у тебя тут выход из слова, если длина строки ненулевая, а надо если нулевая.
Вот так надо бы наверно :
DUP 0= IF 2DUP EXIT THEN \ addr 0 addr 0 , если выход
_KROL писал(а):
OVER -ROT
OVER SWAP
будет то-же самое , только побыстрее и ближе к классике , где есть только ROT


Последний раз редактировалось Ethereal Чт янв 25, 2018 21:23, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Чт янв 25, 2018 21:18 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Ethereal писал(а):
Во вторых у тебя тут выход из слова, если длина строки ненулевая, а надо если нулевая...

А, точно! Или можно -IF, если оно есть в системе. Но этот код уже остался наверное в прошлом, т.к. действительно лучше использовать подход из SP-FORTH.
P.s. Я вернусь позже, у меня послезавтра экзамен - я готовлюсь.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Чт янв 25, 2018 21:27 
<Потерто по справедливому замечанию Victor__v>


Последний раз редактировалось gudleifr Сб янв 27, 2018 14:57, всего редактировалось 1 раз.

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Чт янв 25, 2018 22:38 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
_KROL писал(а):
Но этот код уже остался наверное в прошлом
Симпотный подход. Написал с ошибкой, плюнул и выбросил. Целеустремленность через край. Ну как хош, хозяин-барин. Дальше разбирать код из прошлого не буду.

Рассажу тогда, чтобы хотя-бы образцов для подражания было больше, чем один единственный SP-Forth, как примерно (примерно, не точно, уберу из алгоритмов специфическое ФИГ-овское трюкачество для оптимизации) это дело было в FIG-форте. Написание слова WORD было разбито на две части.

Первая - универсальный разбор строки. Примерно вот так :

ENCLOSE ( addr n char -- addr n1 n2 n3 )

Здесь
addr - адрес начала строки
n - ее длина
char - символ-разделитель
n1 - смещение в строке первого символа не разделителя , т.е. смещение
в строке начала извлекаемого из строки слова
n2 - смещение в строке символа сразу за извлекаемым словом
n3 - смещение в строке первого оставшегося еще не разобранным символа

Ведущие разделители пропускаем полностью.
При разборе могут встретиться три случая
1.) В строке одни разделители. Тогда на выходе n1=n2=n3 = n
2.) Конец извлекаемого слова - это конец строки.
Тогда на выходе n2=n3 = n
3.) После извлекаемого слова встретился минимум один разделитель. Тогда
на выходе n3 = n2 + 1 . Т.е. обнаружив первый символ-разделитель после
извлекаемого слова, сразу завершаем разбор. Этот первый разделитель
считается разобранным, а то, что осталось правее - еще не разобранным.

Слово ENCLOSE удобнее писать на ассемблере.

А вторая часть - применение ENCLOSE для реализации слова WORD . Примерно вот так :
Код:
: WORD
  ( char -- addr )
  >IN @ TIB @ OVER + #TIB @ ROT - ROT ENCLOSE
  >IN +!
  OVER -                \ сосчитали длину извлеченного слова
  DUP HERE C!
  >R + HERE 1+ R> CMOVE
  HERE
;
Переменные : TIB - адрес входного буфера , >IN - текущее смещение (смещение еще не разобранной части) входного буфера , #TIB - число символов, введенных во входной буфер.
Если в строке одни разделители, то извлеченное слово имеет длину 0 и это сигнал к тому, что входной буфер разобран до конца. Можно REFILL - ить.

З.Ы. В ФИГ подстрока во входном буфере задавалась только адресом, а не парой адрес плюс длина. Для этого после конца строки всегда размещался заведомый разделитель. И от этого алгоритмы были проще. Но выше я описал под пару адрес+длина.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Пт янв 26, 2018 10:29 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1285
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
gudleifr писал(а):
Мне кажется, если Вы немножко подумаете, то сами поймете, какую дурость написали, и извинитесь перед коллегой.


Хорошо, какой тут выход?

Факты:
У КРОЛа есть форт
Он умеет писать на ассемблере
В его форте есть баги

Выход: отладить и отполировать форт-систему.

Последствия:
"Ну вот, теперь всё зашибись" через год, читая исходники " хм, а вот тут можно было бы сделать проще"
И Крол напишет форт-систему ещё лучше

_________________
Цель: сделать 64-битную Нову под Винду


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Victor__v писал(а):
Хорошо, какой тут выход?

Факты:
У КРОЛа есть форт
Он умеет писать на ассемблере
В его форте есть баги

Выход: отладить и отполировать форт-систему.


Ох, ну тут же все очевидно. Трактовать фразы можно по-разному, тем более если эти фразы написаны в свободном стиле, а не в формулировках строгих математических выкладок. Фразу в стиле "допиши свой форт, а потом обсудим <....>" можно представить как "работай бессистемно, а потом изучи теорию". С учетом того, что gudleifr имеет прямо-таки маниакальную жажду всех подряд посрамить и послать читать учебники, ничего удивительного, что именно такую интерпретацию он и рассматривает.

Разумеется, теория нужна на каком-то уровне, именно для того, чтобы не изобретать то, что уже изобретено и даже проэволюционировало. Например, парсинг стоит изучить хотя бы на уровне постановки задачи, иначе может получиться так, что время будет потрачено зря. Вот тонкая оптимизация на стадии разработки по сути прототипа действительно лишняя. Это даже определенная психологическая ловушка - легко заявить о каком-то долгострое с блестящими перспективами, чтобы там было и быстро, и безопасно, и гибко, и кроссплатформенно, "а пока вот вам DUP". С этой стороны аккуратно перенаправить человека от слабо проработанных идей к конкретным работающим решениям очень даже правильно.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Пт янв 26, 2018 12:10 
<Потерто по справедливому замечанию Victor__v>


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Сб янв 27, 2018 20:09 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
gudleifr писал(а):
<Потерто по справедливому замечанию Victor__v>

Зря ты так. Ты же сам понимаешь, что он идёт по похожему пути, что я недавно шёл, т.е. без консультаций)
Но по видимому он понимает форт лучше, нежели я.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Сб янв 27, 2018 20:11 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Аж 10 страниц потёр! Ну даёт...
P.s. Хорошо что книгу Уэзерелла уже скачал. Когда система будет готова, то попробую оттуда что-нибудь сделать.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Сб янв 27, 2018 21:49 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
А теперь о том, почему я озадачен разделителями. По базовой архитектуре парсера Черезова мне пришлось составить огромное WORD, но маленькое '.
Код:
: WORD ( ch -- addr sz )
\ Skip CHs (SkipDelimiters1)
BEGIN
  DUP GetChar ( ch ch char flag )
  SWAP ROT ( ch flag char ch )
  = AND ?BREAK
  IN> 1+!
AGAIN
\ Select substring (ParseWord1)
( ch )
CharAddr IN> @ ROT ( addr startoffs ch )
\ SkipWord1
BEGIN ( addr startoffs ch )
  DUP GetChar ( ... ch ch char flag )
  SWAP ROT ( ... ch flag char ch )
  <> AND ?BREAK
  IN> 1+!
AGAIN
( addr startoffs ch )
DROP IN> @ SWAP ( addr endoffs startoffs )
- ;

\ Моё расширение для INTERPRET
: (') ( -- xt sz_flags \ addr sz false )
NextWord 2DUP FIND IF NIP NIP DUP C@ SWAP NAME> THEN

: ' ( -- xt )
(') NOT IF DROP DROP FALSE THEN
;
Можно ли это решить по другому?
P.s. А что, очень даже неплохо выглядит использование (')
Код:
: INTERPRET ( -- )
BEGIN
  EndOfChunk ?BREAK
  (') DUP
  IF
    DUP 80 AND STATE @ NOT OR
    IF \ interpretation or immediate?
      40 AND \ compileonly?
      NOT IF EXECUTE ELSE , THEN
    THEN
  ELSE
    2DUP ?NUMBER _NOT
    IF
      -2 THROW \ какое-то исключение
    ELSE
      NIP NIP
    THEN
  THEN
AGAIN
;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вс янв 28, 2018 02:26 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 12, 2008 03:18
Сообщения: 327
Откуда: Москва
Благодарил (а): 36 раз.
Поблагодарили: 7 раз.
gudleifr писал(а):
<Потерто по справедливому замечанию Victor__v>


ДеЦЦкий СаД какой_то

_________________
Линукс решает, винда глотает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вс янв 28, 2018 04:02 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
_KROL писал(а):
Можно ли это решить по другому?
Ну хотя бы так (суперзаморочный цикл с двумя состояниями)
Код:
\ char
>R TRUE
BEGIN
  TIB @ >IN @ + C@ R@ = OVER =
  >IN @ #TIB @ U< DUP >R AND
  2DUP < IF SWAP >IN @ -ROT THEN
  R> AND
WHILE
  >IN 1+!
REPEAT
R> 2DROP
TIB @ OVER + >IN @ ROT -
\ addr len
Но подобный шизовый стиль я использую, только когда стараюсь сделать шитый код максимально компактным, а других критериев просто нет. Прикладные программы пишутся все-таки без этого "черт ногу сломит". Хотя азарт оптимизировать ассемблерное в длину все равно дает себя знать, на чем бы не писал. Короче моск испорчен ассемблером.

Алго выше проверял только мысленно. Там флаг на стеке суть результат сравнения по = символа с разделителем при котором цикл должен продолжаться, если не конец буфера.
2DUP < IF SWAP ... сработает только если было true false , а значит SWAP даст false true, при этом значение >IN будет запомнено, подоткнуто под параметры на стеке, причем это произойдет строго один раз.

P.S. Засунул этот алго себе в Форт. Все правильно, только одна ошибка
таки есть. Разобранный разделитель сразу после извлеченного слова надо
все таки поглощать. Когда разделителем пробелы, то без разницы, но когда
.( Hello) заключительную скобку надо все-таки в неразобранном не оставлять.
А то Форт при продолжении разбора потока заругается на неизвестное ему слово ")"
Так-что там надо чутка переделать, только выходит вроде уже коряво.

Короче, выше вариант с изюминками, но в итоге все равно неудачный.


Последний раз редактировалось Ethereal Вс янв 28, 2018 11:12, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 536 ]  На страницу Пред.  1 ... 29, 30, 31, 32, 33, 34, 35, 36  След.

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


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

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


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

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