Forth
http://www.fforum.winglion.ru/

Nova-forth версии
http://www.fforum.winglion.ru/viewtopic.php?f=58&t=3183
Страница 2 из 4

Автор:  Victor__v [ Чт июн 27, 2019 14:31 ]
Заголовок сообщения:  Re: Nova-forth версии

Hishnik писал(а):
Выглядит как дополнительный аргумент для создания вот этой самой тестовой базы. Если все будет постоянно меняться, будет крайне неудобно вообще приступать к работе. Напротив, если будет галочка напротив пункта "теперь тут сделано то-то и то-то, и в дальнейшем будет только улучшаться", то это уже интересно. Словари тут не так важны. В конце концов, многие вещи делаются и без словарей.

Ну в словари иногда запихиваются слова для реализации доп. синтаксиса. Тех же локальны переменных. По факту мне пришлось править только подобные места :)

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

Автор:  Hishnik [ Чт июн 27, 2019 16:02 ]
Заголовок сообщения:  Re: Nova-forth версии

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

Автор:  Victor__v [ Чт июн 27, 2019 18:59 ]
Заголовок сообщения:  Re: Nova-forth версии

Предложения по проекту будут?)
А то у меня отпуск скоро закончится)

Автор:  Ethereal [ Чт июн 27, 2019 19:40 ]
Заголовок сообщения:  Re: Nova-forth версии

TERMINATE долго набирать с клавы чтобы выйти из Форта вежливо, т.е без Ctrl-C. А BYE не в падлу и набрать.

Что играет роль ?DUP (без которого программировать коряво) ? Типа
VAR @ ?DUP IF ненулевое значение переменной нужно здесь THEN

И без DO и LOOP тоже как-то страннО.

Без 0< легко можно обойтись. : 0< 0 < ; Но без U< программировать по настоящему невозможно. От слова совсем. Некоторые алгоритмы не реализуемы. В частности адреса памяти я автоматически сравниваю как беззнаковые, иначе верхняя половина памяти окажется как бы ниже нижней. Вообще применение знаковых сравнений там где это явно не нужно раскладывает по тексту время от времени срабатывающие ошибки. Мы ведь интуитивно думаем беззнаковыми числами, выкидывая из головы что где-то там выше положительные числа вдруг превращаются в отрицательные. Ну и там
: WITHIN ( n1|u1 n2|u2 n3|u3 -- flag ) OVER - >R - R> U< ;

Кста : создатель биткоина применил знаковые там где нужны только беззнаковые и заложил багу. Одно из последствий : https://bitcointalk.org/index.php?topic ... sg51037196
Это один из примеров разложенной по тексту ошибки.

Автор:  zma [ Чт июн 27, 2019 20:06 ]
Заголовок сообщения:  Re: Nova-forth версии

Hishnik писал(а):
Что-то уровня "тест, демонстрирующий вычисление суммы элементов массива" и прочее в таком роде.

На http://rosettacode.org можно набрать и задач и реализаций, если кто-то решит заняться.

Автор:  Victor__v [ Пт июн 28, 2019 07:40 ]
Заголовок сообщения:  Re: Nova-forth версии

Ethereal писал(а):
TERMINATE далго набирать с клавы чтобы выйти из Форта вежливо, т.е без Ctrl-C. А BYE не в падлу и набрать.

Что играет роль ?DUP (без которого программировать коряво) ? Типа
VAR @ ?DUP IF ненулевое значение переменной нужно здесь THEN

И без DO и LOOP тоже как-то страннО.

Без 0< легко можно обойтись. : 0< 0 < ; Но без U< программировать по настоящему невозможно. От слова совсем. Некоторые алгоритмы не реализуемы. В частности адреса памяти я автоматически сравниваю как беззнаковые, иначе верхняя половина памяти окажется как бы ниже нижней. Вообще применение знаковых сравнений там где это явно не нужно раскладывает по тексту время от времени срабатывающие ошибки. Мы ведь интуитивно думаем беззнаковыми числами, выкидывая из головы что где-то там выше положительные числа вдруг превращаются в отрицательные. Ну и там
: WITHIN ( n1|u1 n2|u2 n3|u3 -- flag ) OVER - >R - R> U< ;


Насчёт BYE подумаю, проскакивали такие мысли.
?DUP нет и не будет, ибо это странное слово на мой взгляд.
DO LOOP есть в поставке файл ~er/doloop.f В ядре же их нет, поскольку мне они ни разу не требовались.
WITHIN есть в поставке ~er/data-stack/within.f В ядре нет по той же причине. В той же папке другие редкие слова для стека данных. ROLL NDROP REVERSE
Насчёт >U U< введу.

Автор:  Hishnik [ Пт июн 28, 2019 11:59 ]
Заголовок сообщения:  Re: Nova-forth версии

Victor__v писал(а):
Насчёт BYE подумаю, проскакивали такие мысли.
?DUP нет и не будет, ибо это странное слово на мой взгляд.

Все, что определяется через уже существующее, может быть добавлено или нет, на вкус. Если есть какой-то выход, можно его определить хоть через BYE, хоть через ДОСВИДАНИЯ, это уже вопрос удобства. С ?DUP аналогично:

: ?DUP DUP IF DUP THEN ;

Можно предположить, что при активном использовании все равно сначала будет подгружаться что-то вроде mywordspack.f, в котором будет все недостающее конкретному разработчику. Для Кварка я регулярно подобными вещами и занимался - просматривал подобные pack-и и добавлял в ядро те слова, которые там появлялись для каждого проекта.

Victor__v писал(а):
DO LOOP есть в поставке файл ~er/doloop.f В ядре же их нет, поскольку мне они ни разу не требовались.

Вроде бы достаточно часто нужен счетчик цикла.

Автор:  Victor__v [ Пт июн 28, 2019 14:15 ]
Заголовок сообщения:  Re: Nova-forth версии

?DUP в ядре не будет, усё если нужно можно определить никто же не мешает.
Вместо DO LOOP я пользуюсь BEGIN WHILE REPEAT совместно со стеком возвратов, мне хватает.

Автор:  Hishnik [ Пт июн 28, 2019 15:00 ]
Заголовок сообщения:  Re: Nova-forth версии

Victor__v писал(а):
Вместо DO LOOP я пользуюсь BEGIN WHILE REPEAT совместно со стеком возвратов, мне хватает.

?DUP можно выразить, если кому-то нужно, а вот DO LOOP сложнее выразить на Форте, лучше на ассемблере (ну или на том, на чем пишется конкретный Форт). BEGIN WHILE REPEAT тут не вполне замена, потому что нужен счетчик цикла.

Автор:  Victor__v [ Пт июн 28, 2019 15:57 ]
Заголовок сообщения:  Re: Nova-forth версии

Hishnik писал(а):
Victor__v писал(а):
Вместо DO LOOP я пользуюсь BEGIN WHILE REPEAT совместно со стеком возвратов, мне хватает.

?DUP можно выразить, если кому-то нужно, а вот DO LOOP сложнее выразить на Форте, лучше на ассемблере (ну или на том, на чем пишется конкретный Форт). BEGIN WHILE REPEAT тут не вполне замена, потому что нужен счетчик цикла.


Код:
: DO
0 RLIT,
HERE CELL-
POSTPONE 2>R
HERE
; IMMEDIATE


: LEAVE
2 CELLS LIT, POSTPONE RP@ POSTPONE + POSTPONE RP! 
RET,
; IMMEDIATE


: ?DO
POSTPONE DO
1 LIT, POSTPONE RPICK
S" 0= IF LEAVE THEN" EVALUATE
; IMMEDIATE



: LOOP
S" RP@ 1+! 2R@ = IF LEAVE THEN" EVALUATE
3 [CALL] AGAIN
HERE SWAP !
; IMMEDIATE

: +LOOP
S" RP@ +! 2R@ 1+ < IF LEAVE THEN" EVALUATE
3 [CALL] AGAIN
HERE SWAP !
; IMMEDIATE



' R@ HEADER I LAST-LFA L>CFA ! INLINE


Код:
BEGIN WHILE REPEAT тут не вполне замена, потому что нужен счетчик цикла.

0 >R BEGIN R@ какое-то-число XOR WHILE ... RP@ 1+! REPEAT RDROP
Что Вы тут сложности придумываете?

Автор:  Hishnik [ Пт июн 28, 2019 16:28 ]
Заголовок сообщения:  Re: Nova-forth версии

По сравнению с просто "I" огромная разница. Циклы еще характерны для интенсивных вычислений, поэтому чем больше там будет "эмуляции счетчика", тем больше времени будет потрачено вхолостую. Форт, конечно, и так не сверхбыстрый сам по себе, но закладывать такие грабли выглядит странно. Кроме того, обработка двумерных массивов потребует еще J (у меня встречается и K для третьего уровня цикла). Так что это та самая ситуация, когда небольшое добавление может существенно помочь.

Автор:  Ethereal [ Пт июн 28, 2019 16:49 ]
Заголовок сообщения:  Re: Nova-forth версии

Да определить-то не вопрос. Я для твоей Новы уже сделал и проверил :
Код:
: (DO) R> DUP @ >R CELL+ ROT >R 2>R ;
: DO POSTPONE (DO) HERE 0 , ; IMMEDIATE
: I R> R@ SWAP >R ;
: UNLOOP R> RDROP RDROP RDROP >R ;
: LEAVE RDROP RDROP RDROP ;
: (LOOP) R> 2R> 1+ 2DUP = IF 2DROP RDROP CELL+ ELSE 2>R @ THEN >R ;
: LOOP POSTPONE (LOOP) DUP CELL+ , HERE SWAP ! ; IMMEDIATE
Только когда то-же самое на ассемблере то будет куда как быстрее.
Цитата:
?DUP нет и не будет, ибо это странное слово на мой взгляд.
Так ты только для себя пишешь ? И при этом выкладываешь ?
Есть как бы слова core , которые есть у всех Фортов, и странно их состав обрезать. ?DUP (или Фиг-фортовский вариант -DUP) это не странное слово. Когда начнешь его применять вдруг обнаружишь, что оно очень естественное во многих ситуациях. А я бы еще к core словам добавил еще и TUCK , тоже во многих случаях позволяет громоздкое записать кратко.

У тебя в словаре много слов внутренней реализации вроде L>cdwxtFA или NOTF-(VOCS::??) , есть и малополезные вроде 'TAB' , вместо которого можно было писать просто 9 , а вот с самыми нужными беда, беда.

Автор:  Ethereal [ Пт июн 28, 2019 18:11 ]
Заголовок сообщения:  Re: Nova-forth версии

Victor__v писал(а):
DO LOOP есть в поставке файл ~er/doloop.f
Неправильное оно там
Код:
~ER/DOLOOP.F

: TEST
  -5 5 DO
   I .
  -1 +LOOP
;

TEST TERMINATE
Результат
Код:
NOVA-FORTH CDW ver 1.07 author: Victor Erygin (~er)
5
только один оборот цикла. А должно быть
5 4 3 2 1 0 -1 -2 -3 -4 -5

---------------------------------------------------

Вот так другое дело :
Код:
~ER/DOLOOP.F

: +LOOP
  S" 2R@ - 1- SWAP RP@ +! 2R@ - 1- XOR 0 < IF LEAVE THEN" EVALUATE
  3 [CALL] AGAIN
  HERE SWAP !
; IMMEDIATE

: TEST
  -5 5 DO
   I .
  -1 +LOOP
;

TEST TERMINATE
Переопределил твой кривой +LOOP. Результат :
Код:
NOVA-FORTH CDW ver 1.07 author: Victor Erygin (~er)
5 4 3 2 1 0 -1 -2 -3 -4 -5
И 0< вместо 0 < в определении +LOOP оказалось бы кстати.

---------------------------------------------------

Даже вот так пооптимальнее будет :
Код:
: +LOOP
  S" R@ + R> R@ - OVER R@ - XOR SWAP >R 0 < IF LEAVE THEN" EVALUATE
  3 [CALL] AGAIN
  HERE SWAP !
; IMMEDIATE

Автор:  Ethereal [ Сб июн 29, 2019 00:04 ]
Заголовок сообщения:  Re: Nova-forth версии

На те еще багу.
Код:
CREATE BUF 11 C, 22 C, 33 C, 44 C,

BUF BUF 1+ 3 MOVE

BUF C@ .
BUF 1+ C@ .
BUF 2+ C@ .
BUF 3 + C@ .
Результат
Код:
NOVA-FORTH CDW ver 1.07 author: Victor Erygin (~er)
11 11 11 11 OK
OK
Это вот так CMOVE может копировать, а MOVE должно дать
11 11 22 33
потому-что у MOVE в строчке-назначении должно оказаться ровно то, что было в строчке-источнике. Ну такое вроде общепринятое понимание что CMOVE это самое быстрое копирование (беспроблемное для заведомо неперекрывающихся строк), а вот MOVE копирование всегда правильное.

Автор:  Victor__v [ Сб июн 29, 2019 00:23 ]
Заголовок сообщения:  Re: Nova-forth версии

Ethereal,
Спасибо за +LOOP Поправлю.
По поводу отрезка [ RET, ]
Я несколько в недоумении. Есть же слово EXIT

По поводу ?DUP TUCK и иже с ними.
Нова стандарт не поддерживает, ссылаться на core несколько странно.
Цитата:
есть у всех Фортов, и странно их состав обрезать

Все обобщения ложные :)
в Форке от m'Oleg и Кварке хищника нет слова ?DUP Впрочем, давайте забьём на него, ладушки?

По поводу реализации DO LOOP на асме. Можно конечно, но зачем?
Тот же код слова DO в этом плане оптимален. На ассемблере будет точно так же.

Цитата:
Это вот так CMOVE может копировать, а MOVE должно дать
11 11 22 33


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

Страница 2 из 4 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/