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
]]>