logo
TurboProlog / Документация / TOM_2

Вызов Турбо Пролога из других языков.

Не только Турбо Пролог может вызывать предикаты, написанные на дру-

гих языках; другие языки тоже могут вызывать предикаты Турбо Пролога. Ес-

ли глобальный предикат объявлен как существующий в другом языке и для

этого предиката заданы предложения, то Турбо Пролог создает способную к

вызову для этого языка процедуру.

Следующая программа на Турбо Прологе объявляет 2 глобальных предика-

та для языка Турбо Си - message и hello_c. Предикат message может быть

вызван из Си-модуля при помощи имени функции message_0 в ходе Си.

/*Программа CH22EXO1.PRO - Турбо Пролог*/

global predicates

message(string) - (i) language c

hello_c - language c

clauses

message(S) :-

makewindow(13,7,7,"",10,10,3,50),

write(S), readchar(_),

removewindow.

goal

message("Привет из Турбо Пролога"),

hello_c.

Раздел goal из CH22EXO1.PRO вызывает функцию Турбо Си hello_ c, ко-

торая, в свою очередь, вызывает предикат Турбо Пролога message_0, чтобы

вывести сообщение.

/*Программа CH22EXO2.PRO - Турбо Си*/

void hello_c_0()

{

message_0("Привет из Турбо Си");

}

Вы можете использовать эту возможность, чтобы обеспечить легкий дос-

туп к мощной библиотеке Турбо Пролога из других языков.

Вы можете легко определить ваши собственные библиотечные программы в

модуле Турбо Пролога, например, таком:

/*Программа CH22EXO3.PRO*/

project "dummy"

constants

& Выбор вызывающего языка - Си или Паскаля

lang = c

global predicates

myfail language lang as "fail"

mymakewindow(integer,integer,integer,string,integer,integer,

integer,integer) - (i,i,i,i,i,i,i,i) language lang as

"makewindow"

myshiftwindow(integer) - (i) language lang as "shiftwindow"

myremovewindow language lang as "removewindow"

write_integer(integer) - (i) language lang as

"write_integer"

write_real(real) - (i) language lang as "write_real"

write_string(string) - (i) language lang as "write_string"

myreadchar(char) - (o) language lang as "readchar"

myreadline(string) - (o) language lang as "readline"

extprog language lang as "extprog"

clauses

myfail :- fail.

mymakewindow(Who, Wattr, Fattr, Text, Srow, Scol, Rows,

Cols) :-

makewindow(Who, Wattr, Fattr, Text, Srow, Scol, Rows,

Cols).

myshiftwindow(WNO) :- shiftwindow(WNO).

myremovewindow :- removewindow.

write_integer(I) :- write(I).

write_real(R) :- write(R).

write_string(S) :- write(S).

myreadchar(CH) :- readchar(CH).

myreadline(S) :- readline(S).

Константе land должно быть присвоено pascal, c или asm. Следующая

процедура Си, extprog, демонстрирует использование этих новых библиотеч-

ных программ. extprog создает окно Турбо Пролога, а затем производит че-

рез него чтение и запись.

/*Программа CH22EXO4.PRO*/

extprog()

{

char dummychar;

char *Name;

makewindow(1,7,7,"Привет ",5,5,15,60);

write_string("\n\nIsn't it easy");

readchar(&dummychar);

write_string("\nВведи свое имя: ");

readline(&Name);

write_string("\nВаше имя: ");

write_string(Name);

readchar(&dummychar);

removewindow();

}

Единственным ограничением на вызов Турбо Пролога из других языков

является то, что программа на Турбо Прологе должна быть головной, т.к.

Турбо Прологу необходимо установить кучу и стеки.