Модельный язык программирования — исследование типизации: различия между версиями

Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
Нет описания правки
 
(не показано 7 промежуточных версий этого же участника)
Строка 1: Строка 1:
''Модельный язык программирования с шаблонами, на примере которого изучается алгоритм типизации Хиндли-Милнера (Белякова Ю.).''
''Модельный язык программирования с шаблонами, на примере которого изучается алгоритм типизации Хиндли-Милнера (Белякова Ю.).''


= Синтаксис =
Язык нужен для исследования алгоритма типизации. <br />
== Присваивание ==
Основная задача — '''проверка и вывод типов'''.
Nat x = 5;   
'''var''' x = 7.9;  // автовыведение типа переменной
y = x;


== Выражения ==
= Описание =
expr
{{:Модельный язык программирования Polly — описание}}
(expr)
Арифметические:
a + b
a - b
a * b
a / b
a '''div''' b
a '''mod''' b
Логические:
a || b
a && b
!a


== Условный оператор ==
= Ссылки =
'''if''' <условие> '''then'''
* [[Модельный язык программирования Polly — грамматика |Грамматика языка]]
    ops<sub>1</sub>
{'''elif''' <условие<sub>i</sub>> '''then'''
    ops<sub>i</sub>}
['''else'''
    ops<sub>2</sub>]
'''fi'''
 
== Цикл ==
Цикл с ''предусловием''.
'''while''' <условие> '''do'''
    ops;
'''done'''
 
== Функции ==
Определение функции:
Nat foo() '''def'''          // функция без параметров
    ...
    return 5;
'''fed'''
Nat foo(Nat x) '''def'''    // функция с параметрами
    ...
    return x + 7;
'''fed'''
void foo(...) '''def'''      // процедура
    ...
    return;
'''fed'''
'''''t_inf''''' foo(...) '''def'''
    ...
    return true;
'''fed'''
 
Определение шаблона функции:
T foo<T, S>(S->T f, S xx) '''def'''
    ...
'''fed'''
 
Вызов функции:
foo(x, y, ...);
 
== Методы ==
x.p();
 
= Базовые типы =
* Nat
* Bool
* Int
* Double

Текущая версия от 14:48, 24 апреля 2011

Модельный язык программирования с шаблонами, на примере которого изучается алгоритм типизации Хиндли-Милнера (Белякова Ю.).

Язык нужен для исследования алгоритма типизации.
Основная задача — проверка и вывод типов.

Описание

Синтаксис

Присваивание

Nat x = 5;     
var x = 7.9;   // автовыведение типа переменной
y = x;

Выражения

expr
(expr)

Арифметические:

a + b
a - b
a * b
a / b
a div b
a mod b

Логические:

a || b
a && b
!a
a == b
a < (>) b
a <= (>=) b

Условный оператор

if <условие> then
    ops1
{elif <условиеi> then
    opsi}
[else
    ops2]
fi

Цикл

Цикл с предусловием.

while <условие> do
    ops;
endw

Функции

Определение функции:

Nat fun foo()           // функция без параметров
    ...
    return 5;
end

Nat fun foo(Nat x)      // функция с параметрами
    ...
    return x + 7;
end

void fun foo(<параметры>)       // процедура
    ...
    return;
end

fun foo(<параметры>)    // автовыведение типа возвращаемого значения
    ...
    return true;
end

Определение шаблона функции:

T fun foo[!T, S](S->T f, S xx) 
    ...
end

Вызов функции:

foo(x, y, ...);

Типы

Базовые типы

  • Bool
  • Int
  • Double
  • String

Функциональные типы

T->S
T->S->U ~ T->(S->U)
(T->S)->U

Процедуры и функции

Основная функция — typeof.

typeof(<выражение>);

Выражением может быть имя функции, арифметическое или логическое выражение, применение, etc.

Вероятно, добавим вывод:

print()

Лямбда-выражения

Простое лямбда-выражение от одного параметра:

{ Nat x => x*x }

Простое лямбда-выражение от двух параметров:

{ (Nat x, Nat y) => x + y }

Сложное лямбда-выражение от двух параметров (???):

{ (Nat x, Nat y) => var z = x + y; return ((x + y) mod 2 = 0) ? x*x : y*y; }

var lambda = { Nat x => 
  var y = x*x*x;
  var z = f(y);
  return z + x; }

Ссылки