Что нового в будущих версиях VIP.
Предварительный план относительно грядущей версии VIP 6.3 в основном касается усовершенствований PFC (фундаментальные классы Пролога). PDC работает над улучшением языка, который будет совместим с предыдущими версиями (в отличие от шага: VIP5.x -> VIP6.x). Эти новые особенности будут введены в VIP7.0. Однако, в настоящее время неизвестно, будет ли версия 6.4 перед версией 7.0.
А. Visual Prolog 6.3
1) PDC планирует (наконец-то!) сделать новый VDE GUI (что-то типа Дельфийского инспектора объектов). Он позволит редактировать свойства и события не только стандартных элементов управления, но и созданных пользователем (custom controls).
2) Планируется внедрение Диспетчера представления моделей элементов управления (MVC).
2.1) планируется внедрение MVC для версий: TreeView, ListBox, ListEdit, ListButton, и ListView.
2.2) планируется ввести проверку правильности вводимой информации (integer, real) в элементах управления (на основе MVC).
3) Планируется ввести объектно-ориентированный пакет Menu/Toolbar в котором команды будут отделены от Menu/Toolbar.
4) Планируется новый "imageControl", который позволит использовать графические файлы разных форматов (включая, например, JPEG и PNG), используя GDI+.
5) Планируется ввести управление расположением элементов управления с визуальными маркерами (якорями), с помощью которых можно будет прикреплять элементы к заданному месту на слое диалога (окна).
Б. Visual Prolog 7.0
1) Планируется ввести параметрический полиморфизм. Например, вместо описания дерева, содержащего integer или string-элементы:
Код:
domains
bintree_integer =
node(bintree_integer Left, integer Node, bintree_integer Right);
leaf().
domains
bintree_string =
node(bintree_string Left, string Node, bintree_string Right);
leaf().
достаточно будет написать так:
Код:
domains
binTree{Elem} =
node(binTree{Elem} Left, Elem Node, binTree{Elem} Right);
leaf().
Более того, полиморфные предикаты могут манипулировать полиморфными структурами данных. Например, этот предикат вставит вершину в заданное двоичное дерево:
Код:
predicates
insert : (Elem NewNode, binTree{Elem} Tree) -> binTree{Elem} NewTree.
clauses
insert(NewNode, leaf()) = node(leaf(), NewNode, leaf()).
insert(NewNode node(Left, Node, Right)) = NewTree :-
NewNode <= Node,!,
NewTree = node(insert(NewNode, Left), Node, Right).
insert(NewNode node(Left, Node, Right)) = NewTree :-
NewTree = node(Left, Node, insert(NewNode, Right)).
Этот предикат может вставить элементы в двоичное дерево с любыми элементами:
Код:
clauses
ppp() :-
StrTree1 = insert("AAA", leaf()),
StrTree2 = intert("BBB", StrTree1),
IntTree1 = insert(17, leaf()),
IntTree2 = insert(23, IntTree1),
...
Полиморфизм гарантирует безопасность применения разных типов данных, т.е. Вы, например, не сможете вставить целое число в дерево, составленное из строк:
Код:
clauses
ppp() :-
StrTree1 = insert("AAA", leaf()),
SomeTree2 = insert(23, StrTree1), % type error
...
Такая ошибка будет обнаружена на этапе компиляции.
Полиморфизм распространяется и на списки, поэтому, например, определение принадлежности элемента к списку можно описать так:
Код:
predicates
isMember : (Elem Elem, Elem* List) determ.
clauses
isMember(Elem, [Head|Tail]) :-
Elem = Head
or isMember(Elem, Tail).
Этот предикат может быть использован для списка целых чисел:
Код:
isMember(17, [23, 45, 32, 17, 58])
и он же может быть использован для списка, например, строк:
Код:
isMember("aaa", ["asd", "asd", "asd"])
Однако смешанные списки не позволительны:
Код:
L = [23, "aaa", 32, 17, 58] % type error
2) Будет введена конструкция "if-then-else" как элемент языка:
Код:
clauses
p(X) = Y :-
if X = 1 then
Z = 3
else
Z = 7
end if,
Y = 2*Z.
Она же может быть использована без ветки else:
Код:
clauses
p(X) = Y :-
if trace = true() then
writef("Started p(%)n", X)
end if,
...
3) Будет введена возможность глубокого вложения "or":
clauses
Код:
p(X) = Y :-
(X = 1, !, Z = 3 or Z = 7), Y = 2*Z.
Возможность использования точки с запятой ";" конечно же осталась.
4) Будет введён цикл "Foreach" как элемент языка:
Код:
...,
foreach p_nd(X) do
write(X), nl()
end foreach,
...
он равносилен бактрекингу:
Код:
...,
p_nd(X),
write(X), nl(),
fail.
но в отличие от бактрекинга цикл Foreach позволяет продолжать вычисления в этом же клозе.
Цикл Foreach может быть вложенным:
Код:
...,
foreach p_nd(X) do
foreach q_nd(X, Q) do
writef("Q = %, ", Q)
end foreach,
foreach r_nd(X, R) do
writef("R = %, ", R)
end foreach,
writef("nThat was for X = %n", X)
end foreach
...
5) Улучшение (с т.з. PDC) понимания и функциональности списковых операций путём введения нового синтаксиса, поддерживающего широко известный findall(...):
Код:
..., List = [ A || p_nd(A) ], ...
что полностью соответствует прежнему:
Код:
..., findall(A, p_nd(A), List), ...
Новая конструкция позволяет использовать себя функционально:
Код:
..., ppp( [ A || p_nd(A) ] ), ...
Функциональные возможности улучшены до такой степени, что можно писать и так:
Код:
..., List = [ pair(A, math::sin(A)) || p_nd(A) ], ...
и даже так:
Код:
..., List = [R || p_nd(A), S = math::sin(A) R = pair(A,S) ], ...