]]> ]]>

A++ Interpreter

Реализация языка программирования A++

Интерпретатор базового языка A++, разработанный Георгом Лочевским для демонстрации языка. Существуют варианты, написанные на C и Perl, а также онлайн-демо. Версии интерпретатора соответствуют переизданиям книги “Programmierung pur”.

Примеры:

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

]]>

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