- •Общее
- •О языке
- •Встроенные функции
- •Операции композиции
- •Типы данных
- •Описание программы
- •Процесс выполнения функциональной программы
- •Вызов программы
- •Полный пример программы
- •Интерпретатор и компилятор языка FPTL
- •Кластерный интерпретатор
- •Как достигается автоматический поиск переносимых ФП?
- •Как мы находим мемоизуемые ФП?
- •Как мы поддерживаем любое кол-во машин в кластере и процессоров на машине?
- •Массивы в языке FPTL
- •Компилятор программ языка FPTL
- •Характеристики компилятора
- •Тесты компилятора
- •Вычисление интеграла с заданной точностью
- •Тест рекурсии из комплекта тестов с сайта http://shootout.alioth.debian.org/gp4/benchmark.php?test=recursive&lang=all
- •Вычисление значения N-ого числа Фибоначчи на типе данных Nat
- •Разделение строки на лексемы
- •Приложение – тексты тестовых программ
- •Вычиcление интеграла с заданной точностью – Java
- •Вычиcление интеграла с заданной точностью – FPTL
- •Тест рекурсии - Java
- •Тест рекурсии – FPTL
- •Вычисление значения N-ого числа Фибоначчи на типе данных Nat – Java
- •Вычисление значения N-ого числа Фибоначчи на типе данных Nat – FPTL
- •Разделение строки на лексемы – Java
- •Разделение строки на лексемы – FPTL
(I(1,2).c_succ * I(2,2).~c_succ).PLUS
);
MINUS = I(2,2).~c_null ->
I(1,2),
(
(I(1,2).~c_succ * I(2,2).~c_succ).MINUS
);
LT =
(I(1,2).~c_null * I(2,2).~c_succ) -> <true>,
(
((I(1,2).~c_succ * I(2,2).~c_succ).LT) -> <true>, <false>
);
GT =
(I(1,2).~c_succ * I(2,2).~c_null) -> <true>,
(
((I(1,2).~c_succ * I(2,2).~c_succ).GT) -> <true>, <false>
);
EQ =
(I(1,2).~c_null * I(2,2).~c_null) -> <true>,
(
((I(1,2).~c_succ * I(2,2).~c_succ).EQ) -> <true>, <false>
);
GE = (GT * EQ) . or;
LE = (LT * EQ) . or;
CNV = (id*<0>).eq -> <c_null>, (((id*<1>).minus.CNV).c_succ); COUNT = ~c_null -> <0>, (~c_succ.(COUNT * <1>).plus);
}
Application
%fib(26)
Разделение строки на лексемы – Java
package fptl.decompiler.Generated;
import ComputingBlock.InternalForm.Data.*; import java.util.*;
public class Test implements Runnable
{
public void run()
{
System.out.println("Compiled:" + split());
}
private int split()
{
return F("123 345 asdf 23453 asdfas", " ", 1000000, 0);
}
private int F(String arg0, String arg1, int arg2, int arg3)
{
while (!(arg2 == 0))
{
int argTemp2 = arg2 - 1;
int argTemp3 = S0(arg0, arg1) + arg3;
arg2 = argTemp2; arg3 = argTemp3;
}
return arg3;
}
private int S0(String arg0, String arg1)
{
return S1(arg0, arg1, 0);
}
private int S1(String arg0, String arg1, int arg2)
{
while (true)
{
String var8;
if (arg0.indexOf(arg1) == -1)
{
var8 = "";
}
else
{
int var14 = arg0.length() - arg0.indexOf(arg1); int var17 = arg0.indexOf(arg1);
var8 = arg0.substring((var17 + 1), (var17 + 1) + (var14 - 1));
}
if (var8.compareTo("") == 0) break; String var22;
if (arg0.indexOf(arg1) == -1)
{
var22 = "";
}
else
{
int var28 = arg0.length() - arg0.indexOf(arg1); int var31 = arg0.indexOf(arg1);
var22 = arg0.substring((var31 + 1), (var31 + 1) + (var28 - 1));
}
String argTemp0 = var22; int argTemp2 = arg2 + 1; arg0 = argTemp0;
arg2 = argTemp2;
}
return arg2 + 1;
}
}
Разделение строки на лексемы – FPTL
Functional Program split
Scheme split
{
//string*string*int => int @ = (id*<0>).F;
//string*string*int*int => int
F = (I(3,4)*<0>).eq -> I(4,4), ((I(1,4)*I(2,4)*I(3,4).DEC*((I(1,4)*I(2,4)).S0*I(4,4)).plus).F);
//string*string => int S0 = (id*<0>).S1;
//string*string*int => int
S1 = ((I(1,3)*I(2,3)).SP*<"">).eq -> I(3,3).INC,
(((I(1,3)*I(2,3)).SP*I(2,3)* I(3,3).INC ).S1); //string*string => string
SP = (find*<-1>).eq -> <"">, (( (I(1,2).len*find).minus.DEC * find.INC * I(1,2) ).extr);
INC = (id*<1>).plus; DEC = (id*<1>).minus;
}
Application
%split("123 345 asdf 23453 asdfas", " ", 1000000)
Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.