Как стать автором
Обновить

Комментарии 117

моя студенческая любовь — обязательно скачаю поностальгировать!
А можно не качать, а купить за 100 руб девайс (TI LaunchPad с MSP430, привозят за неделю), прошить в него Форт — www.4e4th.us/ и поностальгировать заодно по компьютерам 80х :)
Спасибо большое за наводку! Скорее всего закажу несколько штук (одну себе, остальные друзьям/знакомым).
Интересует с 98 года. Вся проблема, в том, что я еще не видел КАК с помощью форта считать из текстового файла строки и как выполнить SQL запрос. Да я понимаю, что надо вызывать DLL, но сил больше нет уже. Чтоб небыло обидно я спокойно писал графики на PostScript. Форт красив, но надо простые вводные. Немножко. Ну и спасибо. Это всетаки прорыв на хабре.
Да, вы безусловно правы, что на Форте сложновато решать многие задача разработки, но, в принципе, есть Factor, который так же как и Форт — стековый, но в большей степени развит на данный момент. У него есть стандартная библиотека, которая помогает решить многие прикладные задачи. Так что, если вам интересен Форт, то можно взглянуть на его современную инкарнацию.
Factor — не Форт. А кто «больше развит» — SP-Forth или Factor — это еще посмотреть…
Когда сидел под виндой, то в качестве интерпретатора FORTH использовала nnCron, где один из диалектов FORTH использовался в качестве встроенного скриптового языка (а может и сам nnCron на FORTH был написан). Обёртки к о многим функциям Windows32 API там были, как и средства вызова произвольных функций из DLL, благодаря чему написание обёртки к libmysql.dll (или как там она называлась) максимум несколько часов заняло, больше потраченных на изучение собственно API, предоставляемого этой библиотекой. Более того, поскольку обёртки к DLL это не совсем FORTH-way, написал, как бы сейчас назвал, свой DSL на базе этой обёртки, благодаря которому чуть ли не чистый SQL в своих скриптах использовал, то есть писал не нечто вроде " SELECT * FROM table" MYSQL_QUERY DO MYSQL_FETCH_ROW LOOP , а почти (подробностей уже не помню) SELECT * FROM table
nnCron целиком написан на русском SP-Forth ( spf.sourceforge.net/ ) и этот же форт в него и встроен.

Еще более крупная и навороченная программа на том же SP-Forth'е — Eserv ( www.eserv.ru/ ) — комплект серверов для Windows (почта, веб, ftp, прокси и т.д.). В него Форт тоже встроен соответственно — используется в конфигах, для расширений и как server-side скриптер. Там, кстати, SQLite используется активно, так что все для работы с SQL во встроенном форте есть.

Для работы с MySQL в SP-Forth есть несколько библиотек (см. по первой ссылке каталог devel на CVS) — работают как через libmsql, так и через ODBC. Уже лет 10 как.

SP-Forth есть версия для Linux, многие популярные портабельные либы (dll/so) единообразно подключаются как к Linux, так и к Windows-версии (см. примеры в devel/~ac/lib/lin/).

Кстати, SP-Forth'у в этом году стукнуло 20 лет!
PostScript же тоже стэковый и весь тьюринг-полный?
Не пробовали написать на ps нортон-коммандер? :)
PostScript — это фактически специфический графический диалект Форта. Встраиваемый Форт для принтеров. Нортону-коммандеру нечего делать в принтере…
Нет. В PostScript есть кодовые блоки — он более современный, более полноценный и более стековый, чем Форт.
Но это уже не Форт :) Форт по своей сути — метаязык. PS — это язык, реализованный в Форт-концепции.

Из Форта можно сделать любой язык (собственно, видел Форт, расширенный до ЛИСПа, до Бейсика, до Си), но это будет уже не Форт.
Помнится где то ходила инфа про веб сервер, написанный на ps.
А я для этого написал свой интерпретатор форта, в котором для выполнения SQL запросов был и операторы типа SELECT". И даже продал его потом…

Выглядело это примерно так:
5 18 SELECT" id, score from users where age>? limit ?"

Параметры для подстановки брались из стека, так что их надо было тоже в обратном порядке туда класть. Правда я не совсем помню как результаты в стек клались…
Это, всё же, не совсем Форт-стиль. На Форте, скорее, нужно делать отдельный словарь со всеми словами для формирования запроса. Что-то типа.
SQL:
\…
18 «age>» WHERE 5 LIMIT «id, score» «users» SELECT
Я бы так делал.
Сам, правда, пока в подобном случае использовал тупую обёртку:
SELECT: и тут SQL-запрос до конца строки
Согласен. Меня немного извиняет, что это я, ещё учась, писал. Это я ещё забыл упомянуть, что тот интерпретатор был написан на Pascal. Тем не менее случайное изучение Forth — одно из лучших событий в моей жизни как программиста.
Это скорее для объектно-ориентированных квери-билдеров словарь… Если при построении запроса надо два раза пропихнуть физически одну и ту же конструкцию — самое оно.
В начале 90х написал на форте аналог нортон-коммандера, Просто ради фана
Компилировался он, кстати, в .com файл размером около 40 кб. Почти как ассемблер
Это, скажу я вам, была та еще акробатика :)
НЛО прилетело и опубликовало эту надпись здесь
«магистром йодой картинку с новости к поставить если
тему в зайти нельзя будет не»

Почти искажённый фиджийский хинди…
По поводу этих постоянных приколов над якобы неестественным синтаксисом Форта есть старая заметка: www.forth.org.ru/~ac/rationale/FORTH.TXT
С японским языком знакомиться не пробовали, кстати?
В японском «в другую сторону» переворачивается :)
Не зайти будет нельзя в тему, если Йоду магистра к новости на картинку поставить
Так лучше :)
У вас в первой части stack overflow: «не зайти» — глагол, а стэк аргументов пустой.
И для «если» агрументы неправильные (впрочем у меня тоже), нужно добавлять слово «тогда» чтобы получилось по йода-forth-ски: условие ЕСЛИ результат ТОГДА другое ИНАЧЕ
(также это более соответствует всяким китайсикм: сначала тема(известное) потом рема (новое)

Хотя и непонятно как это вообще работает на одном стэке, логично было бы наоборот:
ТОГДА результат условие ЕСЛИ
(оператор ЕСЛИ проверяет верх стэка и если там не тру, просто дропает всё до метки ТОГДА) Вродебы на МК-54 так и было.

И с предлогами вы не совсем правы: предлоги обозначаую роли сущности.
Можно рассматривать как функцию модификации сущности, либо как обозначение аргумента функции (типа как именованные аргументы).
Второе, как я понимаю, для forth чуждо.
Зато первое роднее для русского и частично реализуется падежами.

Более стэково правильная формулировка:

«Йоду магистра картинкою новостною поставить если, тема пропущена небудет тогда»

stack trace:

Йоду		"Йода"
магистра	"магистр Йода"
картинкой	"магистр Йода" "картинка"
новостной	"магистр Йода" "новостная картинка"
поставить 	"новостная картинка с магистром Йодой"
если 		(bang!) "факт наличия новостной картинки с магистром Йодой"
тема		"тема"
пропущена	"пропущенная тема"
небудет 	"не пропущенная тема"
тогда		(bang!) "факт наличия новостной картинки с магистром Йодой" -> "не пропущенная тема"


Блин, я на C# пишу :)
уже нет! :)
Странно, в лиспе ведь тоже используется почти такая же нотация, только оператор пишется в начале. Но при этом лисп по сравнению с фортом не кажется таким уж причудливым.
Необычность Форта только отчасти вызвана постфиксным типом записи, в большей степени необычна его стек-ориентированность. В лиспе хоть и используется префиксная запись, но интерес в нем вызывают другие моменты: ориентированность на лямбда-исчисление, мощное метапрограмммирование. В принципе, проще читать конструкции, где одной функции передается другая, и так далее, то есть, когда идет некая вложенность, чем конструкции, когда все данные лежат в стеке, а мы вызываем в нужном порядке операторы (или слова, в случае Форта) для достижения необходимого результата.
Переключением режимов исполнения в Форте можно создать «эффект ФВП». Даже ваш самый первый пример ." Hello World" таким в какой-то мере является. Аргумент для ." берётся не из стэка ведь, а из последующего ввода. IF… THEN, DO… LOOP из той же серии — они создают свои структуры на стэках, и интерпретируют вложенные команды особым образом. Эти слова — по сути обычные FORTH-слова, через FORTH-слова же и определяемые (только в целях оптимизации их пишут на ассемблере или других языках, как и слова типа 1 или 2, в отличии от слов типа +, которые средствами собственно Форт-машины не реализуются, если на ней не реализовывать ассемблер) элементы библиотеки можно сказать, а не элементы синтаксиса как в мэйнстрим языках. В какой-то (довольно большой) мере DO… LOOP это аналог map/reduce/filter функций в ФП. И если ориентироваться не на синтаксис, а на суть, то Форт куда ближе к функциональным языкам, чем к процедурным. Просто по умолчанию параметры в функции передаются через стэк постфиксным способом. И даже классическая ФВП реализуется на форте легко — используем слово, помещающее адрес любого следующего слова, используемого в качестве ФНП, а в ФВП используем адрес этого слова для его вызова.
В Eserv'е реализация большинства интернет-протоколов (SMTP, POP3, IMAP, HTTP, FTP и т.д.) сделана просто как расширение Форта, т.е. эти интернет-протоколы интерпретируются встроенным транслятором Форта — он «думает», что команды протокола — это текст Форт-программы. Для него они «родные». Врядли в каком-либо еще языке программирования такое возможно.
Пипец. Как же там ошибки хендлятся? С++ дубль-два: кроссплатформенный ассемблер с макроязыком, корчащий из себя язык высокого уровня… Шаг влево, шаг вправо — имеем хрен знает что с непонятными последствиями, очень трудно поддающееся отладке из серии «проще выкинуть и написать заново, чем выяснять, почему неправильно работает».
В смысле? Что вам не нравится в фортовой обработке ошибок? Есть структурная обработка CATCH/THROW, как в большинстве языков. Аппаратные исключения тоже через этот механизм бросаются и ловятся (в SP-Forth'е по крайней мере).

Отладка в Форте удобнее, чем в С++, т.к. кроме тех же инструментов есть и диалоговый режим.

С высокоуровневостью тоже порядок (что собственно и подверждается существованием такого крупного проекта как Eserv — он развивается с 1996 года).
Диалоговый режим — это великая вещь…
IF… THEN, DO… LOOP — это не «обычные слова», это слова с немедленным выполнением: они выполняются сразу, а не во время интерпретации. ifelse — это «обычное слово» в PostScript: условный лямбда-оператор: берёт со стека логическое выражение и два кодовых блока и запускает на исполнение (или исполняет — хз, точно не помню) первый или второй.
У нас разные понятия слова «интерпретировать» значит :) Для меня Форт-транслятор это прежде всего интерпретатор символов входного потока, который может переключаться в некоторых случаях (типа ":") в режим компиляции, создавая новую статью. При этом в случае чего-нибудь типа : DUP? IF DUP THEN ; он временно из режима компиляции переключается обратно в режим интерпретации на словах IF и THEN интерпретируя их немедленно и модифицируя процесс компиляции.
а поясните, как на одном стэке работает «условие IF результат THEN»?

На каком «одном стеке»? У PostScript их тоже два.
А что пихается во второй стэк?
В статье об этом ни слова.
В википедии мутно.
Ну один — стек возвратов, на другом делаются вычисления. У «нормальных» языков глобального второго стека нет, вместо него локально используется верхушка первого.
В одном данные (выступают в роли регистров ассемблерных), в другом адреса возврата.
Грубо говоря, стэк данных используется по разному во время компиляции и исполнения. Когда вы вводите что-то вроде : слово условие IF результат THEN ;, то слово IF компилятор не компилирует на прямую, а вставляет служебное слово в статью, аргумент которого адрес перехода (пока пустой) и сохраняет на стэке адрес адреса перехода, после чего возвращается в режим обычной компиляции, а затем слово THEN берёт со стэка адрес адреса возврата и пишет по нему адрес перехода. А скомпилированное служебное слово берёт адрес со стэка и если не тру, то делает переход на адрес, который был записан THEN во время компиляции.
Вот нифига себе.
Я пожалуй, пойду искать мануал с картинками.
Достаточно написать свой транслятор :)
я уже нашёл онлайн транслятор на жаваскрипте, но он стэк не показывает.
S. — наше всё :)
.S
оно печатает только один стэк
упс, очепатался. но есть ещё .R
В Форте изначально есть и такая новомодная «фича» из Lua, как «тупли»;-)
В Форте вполне возможно метапрограммирование. Так же как и Лисп, Форт позволяет переключаться между режимами «компиляции» и «интерпретации», что открывает дорогу для создания макросов, так как помимо стека данных в Форте программисту доступен и стек возвратов, что дает неограниченный простор для создания собственных структур управления и реализации метапрограммирования.
Стековые языки с лямбдой и списками тоже существуют…
Наоборот. Лисп заметно сложнее и хитрее в реализации. И намного сложнее на практике. Форт чище синтаксически и имеет несравнимо более простой транслятор. Я не видел реализаций Лиспа в 512 байт на ядро системы и в пару килобайт на всю систему с компилятором :)
Я имел в виду причудливость с точки зрения «обычного программиста», а не с точки зрения реализации.
Когда я прочитал первые строки статьи, я сразу всё понял, то есть почему Forth такой старый язык и почему для него так легко сделать компилятор :). Но стеке писать на издевательство форменное программистом над.
В Форте есть локальные переменные (стандартное расширение locals), а глобальные переменные есть в базовом форте (т.е. даже если без расширений). Так что, кому сложно уследить за стеком, может упростить себе жизнь.
Разница между:
СТЕК НАД ПИСАТЬ
и
(писать (стек, над))
не принципиальна :)
В первом случае хоть скобки считать не надо. Более того, для Thinking Forth заявляется требование, чтобы новое слово не превышало 7±2 слов. То есть очень легко и просто видна вся логика выполнения. А вот в Лиспе постоянно практикуются портянки на целый экран кода, завершающиеся гирляндой скобок. На Форте здорово упрощается работа из-за манипулирования потоком исполнения. Лисп этого лишён.
Разница между:
СТЕК НАД ПИСАТЬ
и
(писать (стек, над))
не принципиальна :)
Принципиальна. Без скобок быстро ломаешь мозг. Вот если бы
((СТЕК) НАД) ПИСАТЬ
и
(писать (над, стек))

или

СТЕК НАД ПИСАТЬ
и
писать над стек
(как в Лого вроде)

— то да, непринципиальна.
Это у кого как мозг заточен. Я вот начинал программировать на МК-61 (семейство Б3-34), где также применяется постфиксная запись и стэк данных является основным средством вычислений. Для меня FORTH стал отдушиной после BASIC и C :)
Та-же ботва, только MK-52, и отдушиной стал ассемблер…
… видимо это и вызвало необратимые изменения психики :-)
Я тоже на нём начинал…

Хорошо, что я сразу привык к наличию косвенной адресации и косвенных переходов (фактически начала функционального программирования).
Если вы считаете скобки в лиспе, то вы что-то делаете не так. Это занятие примерно одного уровня с акробатикой со стеком в форте.

Есть, конечно, недолиспы вроде Clojure, автор которой намеренно сделал синтаксис, который заставляет считать скобки, но это уже проблемы отдельного неосилятора.
А как их в нём можно не считать?
А у HP был ещё и RPL…
Там ещё и скобки…
Куда больше Starting Forth я рекомендую Thinking Forth. На русском — в переводе Сергея Дмитренко. Полезно далеко не только фортерам. Я даже в PHP использую многие концептуальные подходы оттуда. Ну а вообще, с Фортом на практике работаю с 1991-го :)
А кто-нибудь когда-нибудь видел вакансии где знание FORTH хотя бы упоминался в качестве плюса?
Фортеры сами себе работу придумывают. Поэтому работодатели таких слов не знают :)
Я видел и собеседовался. Требовался основной скилл — форт.
В 94 году.
С тех пор ни разу не видел ни одной вакансии с упоминанием форта
:)
Я разрабатываю сайт, на котором пользователь может решать различные задачи на разных языках программирования. Особенность в том, что задачи для каждого языка свои специфические и призваны показать преимущества языка, или просто должны быть интересными для решения на этом языке, или просто расширять кругозор. Меня заинтересовал Forth и я бы хотел его добавить. Какие интересные/красивые/познавательные задачи для Forth вы знаете/решали? Желательно задачи небольшие, пример с аналогом нортон командера из коментов выше будет слишком круто.
Кстати,
." Hello world"
— это неправильно. По действующему стандарту надо
.( Hello world)
А с кавычкой — только для режима компиляции (т.е. внутри определений — процедур или функций).

И еще: регистронезависимость — это не свойство Форта, а свойство отдельных реализаций. Стандарт допускает оба варианта и требует это оговаривать в документации.
" Hello world" PRINT
Будет более кросс-фортово.
Нет в стандарте Форта слова PRINT.
<Картинка о едином унифицированном стандарте>.jpg

VECT EMIT

: PRINT // addr -- 
 DUP C@ IF
  BEGIN
   DUP C@ EMIT
   1 +
  DUP C@ NOT UNTIL
 THEN
 DROP
;
Тот же самый коренной недостаток, что и в С++ — нет стандартной реализации и вместо неё куча самопальных…
Недостаток? Скорее фича для истинных творцов, а не ремесленников!
Дающая возможность этих самых ремесленников использовать в крупном строительстве, сотворив им уютный, для понимания, мирок а-ля Arduino…
Главный плюс Forth — это легковесность. Когда на контроллере память исчислялась байтами, это было очень важно. Сегодня этот плюс уже не актуален. А что осталось из минусов? Жесткий самоконтроль по поводу позиций на стеке, сколько и чего взяли, сколько положили. Одна ошибка и вот мы пошли перекапывать стек. Такой абсурд может продолжатся довольно долго и есть шанс, что все таки все хорошо совпадет и программа выдаст результат, но совершенно бессмысленный.

Попыткой это исправить была особая нотация в комментариях, так что бы компилятор знал сколько и чего берем со стека. Но этот костыль не может найти все ошибки логики, а такие ошибки на Forth очень легко сделать. Ну и наконец извечная игра с перестановками на стеке (мне нужен третий элемент, а не верхний). Если не выработался какой то свой стиль работы со стеком, то вагон ярких эмоций обеспечен. А стиль рубится на корню, если использовать библиотеки слов других разработчиков. Forth вообще такой тонкий способ потроллить своих коллег =)
«Самоконтроль» состояния стека — это вообще не вопрос. Форт-стиль — это короткие, однозначные и «тупые» (без сайд-эффектов и смешанного поведения) слова, которые полностью тестируются по мере написания. Поэтому Форт-программа по факту получается более безопасная, чем код на традиционных языках. Акробатика с параметрами на стеке тоже обычно иллюстрирует прокол в архитектуре. Если тебе понадобился третий параметр с вершины, то нужно внимательно присмотреться, в 90% случаев ты допустил где-то концептуальную ошибку.
Согласен, потому и сказал, что это вопрос выработки стиля. Почему только стиля? Потому, что все таки бывают не только «тупые» слова. Их мало, но они есть (обработка ошибок от внешних сервисов и т.п.). И танцы с позициями на стеке неизбежны. И со временем их становится только больше. Я наком с Forth еще с микроконтроллеров, но мы как то быстро все перешли на C и не пожалели. Сейчас все Scala и Python и уже далеко не под «микроконтроллеры». О Forth вспоминаю с приятной ностальгией, но боже упаси писать на нем снова.

Но! Forth как пища для ума и расширение кругозора — очень даже рекомендую.
А мне больше всего импонирует что в Forth все слова имеют определения через другие слова языка. Даже те, которые являются встроенными, для ни определения всё равно есть, хоть и только ради академического интереса.
А мне больше всего импонирует что в Forth все слова имеют определения через другие слова языка.
На сановской Яве с классами почти также. Этим она мне и понравилась в 1998;-)
Когда-то тоже разминал мозг (http://habrahabr.ru/post/138667/) конкатенативными языками, и Forth самый известный его представитель. Понравились и Joy, и Factor, это как тренажеры для развития стека у себя в голове и нестадандартных функциональных подходов.
Когда то писал на ассемблере для 8087. Немного напомнило Forth. Тоже со стеком извращаться приходилось.
Ничего общего. Тоесть вообще
Ну, кое-что, таки есть…
Постфиксность, стек за которым надо следить.
Но фишка форт систем, конечно-же не в этом.
Хотя технически, форт можно рассматривать как продвинутый макроассемблер: код редактора\интерпретатора + базовые слова (по сути макросы ассемблера) в достаточном объёме, что бы можно было создать\загрузить весь остальной словарь.
Хотя технически, форт можно рассматривать как продвинутый макроассемблер
Про С так и пишут: кроссплатформенный макроассемблер.

Да, а ещё есть стековые процессоры — не VM, а «железные»…
Вообще ничего общего? Даже наличие стека как основной структуры данных?
Фишка форта, имхо, «шитый код» :)
У паскаля и бейсика тоже он есть…
Самая популярная в этих краях реализация, SP-Forth, как раз работает не на шитом, а на машинном коде :)
моя любовь. когда то я написал на нём BIOS и систему тестов для одного проекта…
> в рамках операционной системы Ubuntu.
ну вот и пришло то время, когда Ubuntu уже воспринимается как отдельная операционная система. Какое там Linux или GNU/Linux, как любит поправлять Ричар Столман.

Простите за вброс. Сам сижу на Ubuntu.

По теме: Forth для меня был третьим языком, который я изучал. Теперь его место на почетном месте в музее. Ну и для разминки мозга, как справедливо заметил автор.
Что реально мешает в стековых языках — это постоянная необходимость ручной манипуляции со стеком: пропустишь DUP — и лови ошибку час…
С другой стороны, именно этот момент дисциплинирует, требует постоянно держать в голове как данные, так и предшествующие преобразования над ними. Это неплохо развивает. Возможно. вы никогда не будете после написания первой программы на Forth прикасаться к нему снова, но аккуратность привитая Фортом останется даже при использовании других языков.
В смысле «пропустишь DUP»? Почему вы его вдруг должны пропустить? Вы же программист, а не машинистка, набивающая текст с листа.

Никаких специальных манипуляций со стеком при правильном стиле программирования на Forth не требуются. Тут уже писали, что ручные манипуляции со стеком, это как goto структурных языках, признак неправильной архитектуры программы.
Есть опыт написания скриптлетов на самодельном стековом языке. «Пропустить манипуляцию со стеком» (обычно как раз «DUP») — самая распространённая ошибка, правда в 90% случаев валится на следующем же операторе: на находит на стеке данные подходящих для него типов.
Вы же программист, а не машинистка, набивающая текст с листа.
Разница невелика: всё равно хочется feedback как можно раньше. Желательно на этапе компиляции или в IDE при наборе кода. У Лиспа, если упустить баланс скобок, так и получится.
В режиме интерпретации при наличии тестовых данных, вы его будете практически сразу. Быстрее будет просто не куда… Если вы судите о Forth'е по самописному стековому языку, то это зря…
Если вы судите о Forth'е по самописному стековому языку, то это зря…
Ну да, тот настроен на командную строку, файлы исходников и скриптлеты. Разница в стиле как у C# и Java — вроде бы VM похожи, но политика настолько разная, что для C# чего-то типа Ant, Maven и богатства библиотек и серверов как для Java ещё долго не предвидится…
Чем ближе к железу, тем больше аккуратности и дисциплинированности. Корни, торчащие из управления телескопом, биосы, прошивки спутников, etc — не дают оторваться от реальности. Уже не ассемблер, но еще не похапня. Золотая середина, в каком-то смысле.

Давно не писал на нем, иногда даже скучаю :)
Чем ближе к железу, тем больше аккуратности и дисциплинированности.
«Только бондаж и дисциплина, только хардкор»…
Что плохо в Форте и иже с ним: длинные названия слов.

Что плохо в Форте и Лиспе/Схеме: вся программа представляет собой выражение. В самом клиническом случае — в Форте — если упустишь «баланс скобок», то система посчитает, что так и надо и что-то выполнит с каким-то результатом.

Программы на «нормальных» языках разбиты на куски, внутри которых баланс стека/скобок отслеживается компилятором. Программируя на таком языке, ты программируешь фактически на двух языках: один — язык потока управления, другой — язык выражений. Что вносит разнообразие и даёт более приятные ощущения глазам. На Форте и Схеме язык один (на Форте — один синтаксис, на Схеме — одни выражения). Уровни «логики» и «выражений» никак визуально не разделены.
>Что плохо в Форте и иже с ним: длинные названия слов.

Здрасьте! Как раз Форт характерен массой соглашений по сокращению слов (которые, кстати, нередко создают проблему понимания у новичков). Типа:
. (точка) символизирует печать, вывод
/ — символизирует отношение
# — символизирует количество
@ — чтение
! — запись
и т.д.

Всё это здорово сокращает синтаксис, делая Форт-программы крайне лаконичными.

>Программы на «нормальных» языках разбиты на куски, внутри которых баланс стека/скобок отслеживается компилятором.

На Форте каждая программа разбита на куски — короткие «слова». Каждое из которых легко и полноценно тестируется в момент написания.
Для интересующихся фортом (да и вообще для всех, кто любит головоломки), есть прекрасная игра Grobots (Wiki, Documentation, Tutorial).

Жанр — стратегия. Ваша задача написать AI для роботов, на фортоподобном языке. Вот пример кода:
#type Killer Vegetable
#color F0E
#hardware
  solar-cells .3
  constructor .3
  armor 100
  processor 5
  energy 100 0
  grenades 30 15 34
  robot-sensor 15
#code
do
  autoconstruct
  grenades-reload-time periodic-robot-sensor if
    robot-found if
      robot-position robot-velocity lead-grenade
    then
  then
forever


Вначале вы определяете, из каких роботов будет состоять ваша команда, и какие у них будут характеристики:
процессор — скорость выполнения команд
двигатель — определяет скорость передвижения (если вы вообще его ставите на данного робота),
оружие — бластер, гранаты, бомба,
сенсоры — сенсор других роботов, сенсор ресурсов, сенсор летящих снарядов,
ресурсы — вы будете их собирать на карте, или вырабатывать солнечными батареями

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

Язык — довольно простой. API — тоже не сложный. «Физика» и экономика — неплохо сбалансированы.

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

Вот скриншот битвы:
image
Смотрю на код и не вижу что-то там фортоподобного?
Там всего лишь для читабельности добавили идентацию и переносы строк, которые парсер игнорит. Без этого было бы совсем плохо. Вот абсолютно эквивалентный код:
... do autoconstruct grenades-reload-time periodic-robot-sensor if robot-found if robot-position robot-velocity lead-grenade then then forever ...
Как-то постфикса не наблюдаю :) понимаю, что извратиться можно так и на форте и писать 2 + 2, а не 2 2 +, но это будет уже не форт.
В одной из ссылок, которую я дал в своем комментарии, есть следующий пример:
What in a conventional language would be:
    gamma = 1 / sqrt(1 - (v / c)^2)
is in Grobots:
    1 v c / square - sqrt reciprocal gamma!
Стилистически
 1 <hablabla...bla...bla> -

это конструкция хуже, чем
 1 - <hablabla...bla...bla>

потому, что
 <hablabla...bla...bla>
вставляется внутрь выражения.

Неконкатенативно.
Особенно «весело» выглядит в стековых языках конкатенация… хоть строк хоть списков…
А что с ней не так? Не думаю, что сильно сложнее или запутаннее, чем на любом другом языке получится.
В инфиксном виде она выглядит много более наглядно, чем в постфиксном…
new_string = "string 1" + "string 2";


" string 1" " string 2" S+ TO new_string


Особой разницы, вроде бы, и нет.
Разницы нет пока строк мало.

" string 1"" string 2"+" string 3"+" string 4"+" string 5"+" string 6"+ new_string!

Или, с соблюдением стиля

" string 1" " string 2" + " string 3" + " string 4" + " string 5" + " string 6" + new_string !
Да, и при приклеивании головы к списку нагляднее, когда оператор с той же стороны, что и голова, а не с противоположной.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории