]]> ]]>
Править | Обсудить | История

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
  • _ Унарный минус (умножает на -1 S0)
  • =, > Добавить в стек -1, если S1=S0 или S1>S0, соответственно, и 0 в противном случае.
  • &, | Добавить в стек S1&S0, S1|S0; результат — логическое значение 0 или -1
  • ~ Отрицание (инвертирует S0)
  • имя переменной Добавить это имя (не значение переменной!) в стек
  • :, ; Присвоение и получение значения переменной: S0 должен быть именем переменной
  • $ Добавить в стек S0
  • % Удалить верхний элемент стека
  • \ Поменять местами S0 и S1
  • @ Перенести на верх стека элемент S2
  • ø Скопировать на верх стека элемент S<S0> ( эквивалентно $)
  • [...] Поместить функцию в скобках в стек
  • ? Условное выполнение команд: 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

]]>

Работа программистам