to post messages and comments.

← All posts tagged FORTH

Интересный текст richardhaskell.com
коротко, хардварная имплементация раз в 10 быстрее чем реализация на ЯП, Си как обычно тормозит, FORTH-процессоры это ня, надо зопейлить таковой на своей плисине, можно попробовать уходить в крайности RISC/CISC и посмотреть что — лучше, а что — хуже.

Ну допустим как-то так это будет torth.us

Сразу оговорюсь, экспериментальный язык, это поиграться а не писать на нём промышленный код.

Что посоветуете по системе типов на попробовать? Заявленные идеи по типам у меня только по синтаксису есть, а вот может есть что прорывное или просто интересное, которое мало применяется в распространённых языках программирования? Можно с заметными недостатками, нам с тортом не на луну лететь.

Как я писал форт "за вечер"/как рекомендую это делать:

там всего несколько вариантов для самого начала:

1) компиляция в байткод — я использовал, довольно приятно.

2) интерпретация — не так приятно потому что контекст меняется, но легко делается поверх (1) потом.

3) компиляция в машинный код — сложно с поддержкой потом, ну разве только LLVM взять.

Также надо определиться с форматом шитого кода, реализациями словарей и стеков.

Дальше ерунда, взял во входном потоке слово, нашёл в словаре, иначе — ошибка. Если слово нативное (реализованное тобой на языке реализации) — вызвал стандартным механизмом языка, если нет — послал туда интерпретатор байткода если (1), просто интерпретатор если (2), ну а если (3) то все слова нативные. Дли ненативных слов не забываем слежить за стеком возвратов.

эм.. по большей части всё. Для реализации нативных слов не помешают функции работы со входным потоком и управлением интерпретатором. Байткод не жадитесь, берите от 32 бит на команду — что не потратите эффективно, сожмёт архиватор.

конкретнее можно спрашивать в комментариях.

Начал кодить Tox-клиент на 8th (коммерческий кроссплатформенный forth), затестил FFI, довольно мило:
"tox" lib tox

tox drop
"N" "tox_version_major" func: tox_version_major
"N" "tox_version_minor" func: tox_version_minor
"N" "tox_version_patch" func: tox_version_patch

"NNNN" "tox_version_is_compatible" func: tox_version_is_compatible

"Pn" "tox_options_new" func: tox_options_new

tox_version_minor .
tox_version_major .
tox_version_patch .
1 2 3 tox_version_is_compatible .

В #2787846 обещал для SP-Forth синтаксического сахара в виде:
: lala 1 . ;
lala
1  Ok
lala`
1  Ok
lala`lka
1 Ok

Как сделать: берём библиотеку cafeins.f (я думаю вам она всё равно понадобится, чтобы ЯЗЫК НА ВАС НЕ КРИЧАЛ), и там перед CEQUAL-U вставляем следующий код:
    2SWAP 2DUP S" `" SEARCH IF
    	NIP -
    ELSE
    	2DROP
    THEN

Вообще надо было в другом месте править, заодно с цифрами и прочим, но как-то с документацией у SP-Forth не очень, библиотеки проще прочитать. К сожалению, `вотэто будет незнакомым словом по-прежнему, как и 1`единичка, как раз поэтому. В парсер надо лезть. Но главного я доби`лся , хорошо хоть форт легко позволяет этого доби`ваться .

Дайджест форто-веселья . Во-первых , это очень выразительный язык , зацените :
blinker @ not blinker !Блинкер , собака такая , не блинкер .

Ещё поймал себя на том что в комментариях к коду пару раз поставил пробелы перед знаками препинания . То ли ещё будет ;

Реализовать набор слов, реализующих делегацию. То есть у форт-программы есть интерфейс ввода/вывода к другой форт-программе, и первая может тогда конечно попросить вторую выполнить слово и вернуть результат. В случае, если слово незнакомо получателю, отправить его определение, и так далее пока слово не выполнится.

Очевидны минусы, главный пожалуй — делегация не экономит особо времени, если только слова не какие-то зубодробительные, однако оно не для того, а например для доступа к железу, которое есть у подчинённой программы, и нету у ведущей.

Сложности тоже ясны, главная — области видимости. Решается либо аккуратным программированием, но тогда ведущая программа, как и программист, должна знать всё что знает делегат (не круто), либо чистыми функциями — но тогда с доступом к инфе неясно, либо с явным указанием, что берётся из словаря подчинённого, а что переносится с ведущего.

И вообще пока очень размытая концепция, надо думать или кодить.

на самом деле не только *forth, а любой интерпретируемый язык тоже.

Суть такова:

Запускаете интерпретатор. Описываете объекты "мира", ну там например домики, ботов. Описываете персонажа, даёте ему методы и прочее. Ну и начинаете "играть", выполняя задания этим персонажем. Можно так рпгшить, можно экшонить, да что заблагорассудится. Что из взаимодействий "честно" что нет — решаете сами.

А потом, если понравилось, логи процесса "игры" сохраняете, анализируете, пилите нормальную игру на любом языке и выпускаете. А если и нет, вы поиграли в игру, в которую никто никогда не играл — уникальную, которую "написали" за часик.

Чем-то DnD и прочие словески напонинает.

Иногда мне хочется иметь аккаунт на хабре. Например, в комментариях к статье habrahabr.ru в ответ на каждый комментарий автора, восхваляющий OBERON, писать что-то вроде "но это есть и в FORTH!", просто так.

Или я мог бы не писать, а почитать FORTH vs OBERON дискасс, а то война древности с современностью и современности с другой современностью это мейнстрим и скучно. Можно прямо здесь. Есть оберонеры на жуйке? Велкам и рецомменд.

Когда свою форт-машину писал, делал там синтаксический сахар, с ним литературность довольно-таки заметно повышалась: вводился символ ` (или ', не помню уже), отсекающий окончание слова. То есть вот-так'ое слово с вот-так'им были с точки зрения программы одним словом.

Это не единственное применение, так можно и кратко комментировать в середине строки гораздо менее громоздко нежели скобочками. Может показаться странным, но когда писал код — действительно было удобно.

В процессе написания #2786776 подумал что можно это и в парсеры других фортов форт-кодом добавлять. Хотя для отдыха ленивовато таким заниматься, но с другой стороны — интересненько. Может для SPF и Amforth сделаю

вынесу из комментов к #2785629, пожалуй. Наивная, конечно, реализаци, ну и не запускал так что могут быть ошибки уровня опечаток.

variable Печь
: поставить ;
: на ;
: градусов, swap ! ;

0
1+ dup value Яйца,
1+ dup value муку
1+ dup value сахар,
drop

create котёл 3 allot

: в ;
: В ;
: всего ;
; все ;
: ингредиента ;
: поместить, swap 0 do tuck ! loop ;

котёл value котле

defer вязкость
' > is вязкость

( взято с http://rosettacode.org/wiki/Sorting_algorithms/Bubble_sort#Forth )
: перемешать. ( addr cnt -- )
  dup 1 do
    2dup i - cells bounds do
      i [email protected] вязкость if i [email protected] swap i 2! then
    cell +loop
  loop ;

Печь поставить на 300 градусов,
Яйца, сахар, муку - всего 3 ингредиента в котёл поместить,
В котле все 3 ингредиента перемешать.

Решение задачи из #2745090 на gforth. На оптимальность решения не претендую (оно наивное), также интересно было самому написать - в реализации стандартных слов (например, .) не подглядывал. Замечания приветствуются. Комментариями снабжать сперва начал (первая строка), но это выглядело странно, так что оставил только карты стека. Выполнять например так: -234 n>s type

\ create string buffer with 20 cells alloting
create string-buffer 20 cells allot

: n>s ( n --  c-addr u )
	dup 0< if negate '-' swap else 0 swap then 0 ( minus-char number length )
	begin 1+ swap 10 /mod swap '0' + -rot tuck 0= until nip
	1+ dup roll swap ( chars length )
	dup begin 2dup - string-buffer + 1 4 roll fill 1- dup 0= until drop
	string-buffer swap
;