FALSE
- Дата создания:
- 1993
- Создан под влиянием:
- Повлиял на:
- Парадигма:
- Типизация:
- Принятые расширения файлов:
- .f
- Реализации и версии (свернуть все | развернуть все):
FALSE — один из старейших эзотерических языков программирования, положивший начало целому поколению языков с односимвольными командами. В отличие от большинства более поздних языков, предоставляет достаточно большой набор возможностей, в том числе именованные переменные, строки и лямбда-функции.
FALSE был создан Wouter van Oortmerssen в 1993 году. Он ставил перед собой две цели — как можно более запутанный синтаксис (в стиле APL) и компилятор как можно меньшего размера. В итоге авторский компилятор, написанный на ассемблере, занимал ровно 1024 байта. Многие элементы языка, в том числе стек как основная структура данных, были заимствованы из Forth.
Типы данных, доступные в языке — целые 32-битные числа, строки, символы (обрабатываются как их ASCII-коды) и логические значения (0 — false, -1 — true). В стеке могут находиться не только числа, а и имена переменных, и функции.
Команды языка
S<n> означает n-ый элемент от верхушки стека; так, S0 — верхний элемент.
-
числоДобавить это число в стек -
'символДобавить ASCII-код этого символа в стек -
+, -, *, /Добавить в стекS1+S0, S1-S0, S1*S0, S1/S0 -
_Унарный минус (умножает на -1S0) -
=, >Добавить в стек -1, еслиS1=S0илиS1>S0, соответственно, и 0 в противном случае. -
&, |Добавить в стекS1&S0, S1|S0; результат — логическое значение 0 или -1 -
~Отрицание (инвертируетS0) -
имя переменнойДобавить это имя (не значение переменной!) в стек -
:, ;Присвоение и получение значения переменной:S0должен быть именем переменной -
$Добавить в стекS0 -
%Удалить верхний элемент стека -
\Поменять местамиS0иS1 -
@Перенести на верх стека элементS2 -
øСкопировать на верх стека элементS<S0>(0øэквивалентно $) -
[...]Поместить функцию в скобках в стек -
?Условное выполнение команд:S1должен быть условием, аS0— функцией, выполняющейся, если условие истинно -
#Циклwhile:S1— функция, задающая условие продолжения цикла,S0— функция-тело цикла -
.,,ВывестиS0как число/символ -
^Прочитать символ -
ßСброс содержимого буфера ввода/вывода
Элементы синтаксиса:
| Комментарии, которые не могут быть вложенными | { ... } |
|---|---|
| Регистрозависимость | да (применима только для имен переменных) |
| Регулярное выражение идентификатора переменной | [a-z] |
| Присваивание значения переменной | : |
| Равенство | = |
| Неравенство | =~ (две отдельные команды - равенство и отрицание) |
| Сравнение | > |
| Если - то | ? |
Ссылки:
Примеры:
Hello, World!:
Пример для версий Morphett's FALSE, Wouter's FALSE 1.2.CFСтрока эквивалентна команде вывода ее содержимого на печать.
"Hello, World!"
Факториал:
Пример для версий Morphett's FALSE, Wouter's FALSE 1.2.CFИспользуется итеративное вычисление факториала. В переменных i и f хранятся текущее число (счетчик цикла) и текущее значение факториала. После инициализации переменных начинается цикл: [i;17=~] — условие продолжения цикла: пока i не равно 17. Затем следует тело цикла, в котором выводится значение i и символьная константа, затем i увеличивается на 1, выводится старое значение факториала и вычисляется новое.
Для Wouter’s FALSE 1.2.CF значения факториала 13 и больше вычисляются с ошибкой из-за переполнения.
0i: 1f:
[i;17=~]
[i; $."! = " 1+$i: f;$.10, *f:]
#
Числа Фибоначчи:
Пример для версий Morphett's FALSE, Wouter's FALSE 1.2.CFИспользуется итеративное вычисление чисел Фибоначчи. Текущие числа хранятся в переменных a и b, счетчик цикла — в i.
Второй цикл примера очищает содержимое стека (числа Фибоначчи, записанные в него первым циклом). Некоторые интерпретаторы позволяют оставлять данные в стеке после конца работы программы, но, к примеру, Wouter’s FALSE 1.2.CF требует, чтобы стек был пустым, и выдает ошибку выполнения в противном случае.
0i: 1a: 1b:
[i;16=~]
[a; $. ", " $ b; $ a: + b: i;1+i:]
#
"..."
[1=~]
[]
#
%
CamelCase:
Пример для версий Morphett's FALSEВведенная строка обрабатывается посимвольно. В Morphett’s FALSE строки вводятся во всплывающем окне, и признаком конца ввода является пустая строка, которая преобразуется в значение -1; поэтому в качестве признака конца цикла используется -1. Условное выполнение команд ? позволяет только выполнить команду, если условие истинно; для реализации ветви else приходится дублировать условие (переменная l), инвертировать его и использовать еще один оператор ?.
1_s: ^
[$1_=~]
[ $$ 96> \123\> & [32-]?
$$ 64> \91\> & $l: [s;~[32+]? , 0s:]? l;~[1_s: %]?
^]
#
CamelCase:
Пример для версий Wouter's FALSE 1.2.CFЭтот пример аналогичен примеру для Morphett’s FALSE, за исключением того, что в Wouter’s FALSE 1.2.CF признаком конца ввода является конец строки, поэтому условие продолжения цикла использует сравнение с 10. Кроме того, % в конце программы очищает стек от оставшегося там значения.
1_s: ^
[$10=~]
[ $$ 96> \123\> & [32-]?
$$ 64> \91\> & $l: [s;~[32+]? , 0s:]? l;~[1_s: %]?
^]
#
%
Комментарии
]]>blog comments powered by Disqus
]]>