Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
" SELECT * FROM table" MYSQL_QUERY DO MYSQL_FETCH_ROW LOOP , а почти (подробностей уже не помню) SELECT * FROM table 5 18 SELECT" id, score from users where age>? limit ?"условие ЕСЛИ результат ТОГДА другое ИНАЧЕТОГДА результат условие ЕСЛИ Йоду "Йода" магистра "магистр Йода" картинкой "магистр Йода" "картинка" новостной "магистр Йода" "новостная картинка" поставить "новостная картинка с магистром Йодой" если (bang!) "факт наличия новостной картинки с магистром Йодой" тема "тема" пропущена "пропущенная тема" небудет "не пропущенная тема" тогда (bang!) "факт наличия новостной картинки с магистром Йодой" -> "не пропущенная тема"
." Hello World" таким в какой-то мере является. Аргумент для ." берётся не из стэка ведь, а из последующего ввода. IF… THEN, DO… LOOP из той же серии — они создают свои структуры на стэках, и интерпретируют вложенные команды особым образом. Эти слова — по сути обычные FORTH-слова, через FORTH-слова же и определяемые (только в целях оптимизации их пишут на ассемблере или других языках, как и слова типа 1 или 2, в отличии от слов типа +, которые средствами собственно Форт-машины не реализуются, если на ней не реализовывать ассемблер) элементы библиотеки можно сказать, а не элементы синтаксиса как в мэйнстрим языках. В какой-то (довольно большой) мере DO… LOOP это аналог map/reduce/filter функций в ФП. И если ориентироваться не на синтаксис, а на суть, то Форт куда ближе к функциональным языкам, чем к процедурным. Просто по умолчанию параметры в функции передаются через стэк постфиксным способом. И даже классическая ФВП реализуется на форте легко — используем слово, помещающее адрес любого следующего слова, используемого в качестве ФНП, а в ФВП используем адрес этого слова для его вызова. : DUP? IF DUP THEN ; он временно из режима компиляции переключается обратно в режим интерпретации на словах IF и THEN интерпретируя их немедленно и модифицируя процесс компиляции.: слово условие IF результат THEN ;, то слово IF компилятор не компилирует на прямую, а вставляет служебное слово в статью, аргумент которого адрес перехода (пока пустой) и сохраняет на стэке адрес адреса перехода, после чего возвращается в режим обычной компиляции, а затем слово THEN берёт со стэка адрес адреса возврата и пишет по нему адрес перехода. А скомпилированное служебное слово берёт адрес со стэка и если не тру, то делает переход на адрес, который был записан THEN во время компиляции. Разница между:Принципиальна. Без скобок быстро ломаешь мозг. Вот если бы
СТЕК НАД ПИСАТЬ
и
(писать (стек, над))
не принципиальна :)
" Hello world" PRINTВы же программист, а не машинистка, набивающая текст с листа.Разница невелика: всё равно хочется feedback как можно раньше. Желательно на этапе компиляции или в IDE при наборе кода. У Лиспа, если упустить баланс скобок, так и получится.
Если вы судите о Forth'е по самописному стековому языку, то это зря…Ну да, тот настроен на командную строку, файлы исходников и скриптлеты. Разница в стиле как у C# и Java — вроде бы VM похожи, но политика настолько разная, что для C# чего-то типа Ant, Maven и богатства библиотек и серверов как для Java ещё долго не предвидится…
{1 @y {+x 0 = {}{* ?x 1 - 1 ! !} ? !}! -x} 'factorial !#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
... do autoconstruct grenades-reload-time periodic-robot-sensor if robot-found if robot-position robot-velocity lead-grenade then then forever ...
What in a conventional language would be:
gamma = 1 / sqrt(1 - (v / c)^2)
is in Grobots:
1 v c / square - sqrt reciprocal gamma!
new_string = "string 1" + "string 2";
" string 1" " string 2" S+ TO new_string
Разомнем мозг при помощи Forth?