Чистый (язык программирования) - Pure (programming language)

Чистый
Pure lang logo.png
Парадигма Функциональный , декларативный , переписывание терминов
Разработано Альберт Греф
Разработчик Альберт Греф
Впервые появился 2008 ; 13 лет назад ( 2008 )
Стабильный выпуск
0,68 / 11 апреля 2018 г . ; 3 года назад ( 2018-04-11 )
Печатная дисциплина Сильный , динамичный
Операционные системы Кроссплатформенность : FreeBSD , Linux , macOS , Windows
Лицензия Стандартная общественная лицензия ограниченного применения GNU
Интернет сайт agraef .github .io / чистый язык /
Под влиянием
Q, Haskell , Lisp , Алиса , MATLAB

Pure , преемник эквационального языка Q , представляет собой динамически типизированный функциональный язык программирования, основанный на переписывании терминов . Он имеет средства для пользовательского синтаксиса операторов , макросов , арифметики произвольной точности (числа с множественной точностью) и компиляции в собственный код через LLVM . Pure - это бесплатное программное обеспечение с открытым исходным кодом, распространяемое (в основном) по лицензии GNU Lesser General Public License версии 3 или более поздней.

Pure поставляется с интерпретатором и отладчиком, обеспечивает автоматическое управление памятью, обладает мощными возможностями функционального и символьного программирования и интерфейсом с библиотеками на C (например, для числовых, низкоуровневых протоколов и других подобных задач). В то же время Pure - это небольшой язык, созданный с нуля; его интерпретатор невелик, а библиотечные модули написаны на Pure. Синтаксис Pure похож на синтаксис Miranda и Haskell , но это язык свободного формата, поэтому для обозначения структуры программы используются явные разделители (а не отступы внешних правил ).

Язык Pure является преемником языка эквационального программирования Q, ранее созданного тем же автором, Альбертом Графом из Университета Майнца , Германия. По сравнению с Q, он предлагает некоторые важные новые функции (такие как локальные функции с лексической областью видимости , эффективная поддержка векторов и матриц, а также встроенный интерфейс C), а программы работают намного быстрее, поскольку они точно вовремя компилируются в собственный код. на лету. В настоящее время Pure в основном нацелен на математические приложения и научные вычисления , но его интерактивная среда интерпретатора, интерфейс C и растущий набор дополнительных модулей делают его подходящим для множества других приложений, таких как искусственный интеллект , символьные вычисления и работа в реальном времени. обработка мультимедиа.

Плагины Pure доступны для электронной таблицы Gnumeric и графического мультимедийного программного обеспечения Miller Puckette Pure Data , которые позволяют расширять эти программы функциями, написанными на языке Pure. Интерфейсы также предоставляются в виде библиотечных модулей для GNU Octave , OpenCV , OpenGL , научной библиотеки GNU , FAUST , SuperCollider и liblo (для Open Sound Control (OSC)).

Примеры

Эти числа Фибоначчи (наивная версия):

fib 0 = 0;
fib 1 = 1;
fib n = fib (n-2) + fib (n-1) if n>1;

Лучшая ( хвостовая рекурсивная и линейная ) версия:

fib n = fibs (0,1) n with
  fibs (a,b) n = if n<=0 then a else fibs (b,a+b) (n-1);
end;

Вычислите первые 20 чисел Фибоначчи:

map fib (1..20);

Алгоритм для ˝n˝ Куинз задачи , которая использует список понимание для организации поиска с возвратами:

queens n = search n 1 [] with
  search n i p  = [reverse p] if i>n;
                = cat [search n (i+1) ((i,j):p) | j = 1..n; safe (i,j) p];
  safe (i,j) p  = ~any (check (i,j)) p;
  check (i1,j1) (i2,j2)
                = i1==i2 || j1==j2 || i1+j1==i2+j2 || i1-j1==i2-j2;
end;

Хотя Pure по умолчанию использует активную оценку , он также поддерживает ленивые структуры данных, такие как потоки (ленивые списки ). Например, алгоритм Дэвида Тернера для вычисления потока простых чисел путем пробного деления может быть выражен в Pure:

primes = sieve (2..inf) with
  sieve (p:qs) = p : sieve [q | q = qs; q mod p] &;
end;

Использование &оператора поворачивает хвост решета в стук , чтобы задержать его вычисления. Преобразователь оценивается неявно, а затем запоминается (с использованием оценки вызова по необходимости ) при доступе к соответствующей части списка, например:

primes!!(0..99); // yields the first 100 primes

Pure имеет эффективную поддержку векторов и матриц (аналогично MATLAB и GNU Octave ), включая векторные и матричные представления. Например, алгоритм исключения Гаусса с частичным поворотом может быть реализован в Pure следующим образом:

gauss_elimination x::matrix = p,x
when n,m = dim x; p,_,x = foldl step (0..n-1,0,x) (0..m-1) end;

step (p,i,x) j
= if max_x==0 then p,i,x else
    // updated row permutation and index:
    transp i max_i p, i+1,
    {// the top rows of the matrix remain unchanged:
     x!!(0..i-1,0..m-1);
     // the pivot row, divided by the pivot element:
     {x!(i,l)/x!(i,j)                 | l=0..m-1};
     // subtract suitable multiples of the pivot row:
     {{x!(k,l)-x!(k,j)*x!(i,l)/x!(i,j) | k=i+1..n-1; l=0..m-1}}
when
  n,m = dim x; max_i, max_x = pivot i (col x j);
  x = if max_x>0 then swap x i max_i else x;
end with
  pivot i x = foldl max (0,0) [j,abs (x!j)|j=i..#x-1];
  max (i,x) (j,y) = if x<y then j,y else i,x;
end;

/* Swap rows i and j of the matrix x. */

swap x i j = x!!(transp i j (0..n-1),0..m-1) when n,m = dim x end;

/* Apply a transposition to a permutation. */

transp i j p = [p!tr k | k=0..#p-1]
with tr k = if k==i then j else if k==j then i else k end;

/* Example: */

let x = dmatrix {2,1,-1,8; -3,-1,2,-11; -2,1,2,-3};
x; gauss_elimination x;

Как язык, основанный на переписывании терминов , Pure полностью поддерживает символьные вычисления с помощью выражений. Вот пример , показывающий использование местных переписывающих правил для расширения и фактор простых арифметических выражений:

expand = reduce with
  (a+b)*c = a*c+b*c;
  a*(b+c) = a*b+a*c;
end;

factor = reduce with
  a*c+b*c = (a+b)*c;
  a*b+a*c = a*(b+c);
end;

expand ((a+b)*2); // yields a*2+b*2
factor (a*2+b*2); // yields (a+b)*2

Вызывать функции C из Pure очень просто. Например, следующее импортирует putsфункцию из библиотеки C и использует ее для печати строки "Hello, world!"на терминале:

extern int puts(char*);
hello = puts "Hello, world!";
hello;

Смотрите также

использованная литература

Примечания

внешние ссылки