A++
- Дата создания:
- 2002
- Парадигма:
- Типизация:
- Принятые расширения файлов:
- .app
- Реализации и версии (свернуть все | развернуть все):
A++ (название происходит от “abstraction + reference + synthesis”) — язык программирования, основанный на лямбда-исчислении и предназначенный для изучения сути принципов искусства программирования.
A++ был придуман в 2002 году Георгом Лочевским (Georg P. Loczewski). Он задуман как эффективный обучающий инструмент; для решения практических задач следует использовать реализацию ARS++, расширяющую A++ до полноценного языка, похожего на Scheme.
ARS
Лямбда-исчисление в чистом виде применимо только к функциональному программированию, но его можно обобщить до трех основных принципов ARS, в том или ином виде присутствующих во всех языках программирования. Принципами ARS являются абстракция (выделение сущности и ее именование), использование ссылок (обращение к абстракциям по их символическим именам) и синтез (комбинирование нескольких абстракций в новые абстракции). Четвертым принципом можно считать лексическую область видимости: переменные в функциях подразделяются на лямбда-связанные (т.е. переданные как аргументы функции) и свободные (определенные в контексте функции, унаследованном от тех абстракций, на основе которых была создана функция). Лямбда-абстракции инкапсулируются в момент их создания вместе с контекстом.
Эти основные принципы позволяют писать программы на A++ в нескольких стилях: функциональном, структурном, объектно-ориентированном (через обмен сообщениями) и логическом (основанном на правилах).
Ниже приведен синтаксис языка в расширенной форме Бэкуса-Наура:
expression = abstraction | reference | synthesis.
abstraction = "(define" variable expression ")" | "(lambda(" { variable } ")" expression { expression } ")".
reference = variable.
synthesis = "(" expression { expression } ")".
variable = symbol.
A++ содержит минимальный набор примитивов, необходимых для взаимодействия программы с окружающей средой — числовые и логические константы, функции вывода на печать и т.д. Кроме того, небольшая библиотека расширяет этот набор до более-менее удобного, включающего структуры данных, объектно-ориентированное программирование и т.д. Дальнейшее расширение языка приводит к ARS++.
Ссылки:
Примеры:
Hello, World!:
Пример для версий A++ InterpreterВывод программы имеет следующий вид:
-->Hello, World!
void
(print "Hello, World!")
Факториал:
Пример для версий A++ InterpreterПервое выражение загружает библиотеку init
, содержащую основные конструкции языка (циклы, условные переходы, сравнения и т.д.). Все эти конструкции не входят в основу языка и определяются через примитивы; так, например, конструкция if
определяется следующим образом:
(define true (lambda (x y)
x))
(define false (lambda (x y)
y))
(define if (lambda (b t f)
(b t f)))
Второе выражение определяет факториал как рекурсивную функцию. Отметим, что стандарт языка определяет два вида чисел — обычные целые с привычными арифметическими действиями и “понятийные” zero, one, two, ..., ten
. Числа разных видов не перекодируются друг в друга и используются отдельно; в данном случае применяются обычные целые.
Третье выражение определяет основной цикл, и четвертое — вызывает его. Команда print
завершает вывод переводом строки, в результате вывод программы имеет следующий вид:
-->0
-->! =
-->1
-->1
-->! =
-->1
-->2
-->! =
-->2
-->3
-->! =
-->6
-->4
-->! =
-->24
-->5
-->! =
-->120
...
Значения факториалов вычисляются правильно до 12!, затем происходит переполнение, и последующие значения выводятся как -1.
(load "app/init.app")
(define factorial (lambda(n)
(if (equal n 0)
1
(* n (factorial (- n 1))))))
(define main
(lambda(n)
(while (not (equal n 17))
(lambda()
(print n)
(print "! = ")
(print (factorial n))
(define n (+ n 1))))))
(main 0)
Числа Фибоначчи:
Пример для версий A++ InterpreterВ этом примере используется хвостовая рекурсия.
(load "app/init.app")
(define fibonacci (lambda(f1 f2 n)
(if (equal n 0)
f1
(fibonacci f2 (+ f1 f2) (- n 1)))
))
(define main
(lambda(n)
(while (not (equal n 16))
(lambda()
(print (fibonacci 1 1 n))
(define n (+ n 1))))))
(main 0)
Комментарии
]]>blog comments powered by Disqus
]]>