2014-11-09 3 views
2

В. Какой простой шаблон для создания двухмодульной программы для ртути? Module_1 определяет и экспортирует простую функцию или предикат. Module_2 импортирует функцию/предикат для вычисления полезного результата и выводит результат.Создание многомодульных программ по ртути

ответ

2

Я хотел бы использовать следующий подход, сначала необходимо определить модуль с функции (ий) или предиката (ов) или предикаты вы хотите экспортировать (интерфейс раздела):

% File: gcd.m 

:- module gcd. 

:- interface. 
:- import_module integer. 

:- func gcd(integer, integer) = integer. 

:- implementation. 

:- pragma memo(gcd/2). 
gcd(A, B) = (if B = integer(0) then A else gcd(B, A mod B)). 

Файл с помощью экспортируемого функция в модуле НОД (НОД/2):

% File: test_gcd.m 

:- module test_gcd. 

:- interface. 

:- import_module io. 

:- pred main(io::di, io::uo) is det. 

:- implementation. 

:- import_module char. 
:- import_module gcd. 
:- import_module integer. 
:- import_module list. 
:- import_module std_util. 
:- import_module string. 

main(!IO) :- 
    command_line_arguments(Args, !IO), 
    ArgToInteger = integer.det_from_string `compose` list.det_index0(Args), 

    A = ArgToInteger(0), 
    B = ArgToInteger(1), 

    Fmt = (func(Integer) = s(integer.to_string(Integer))), 
    GCD = gcd(A, B), 
    io.format("gcd(%s, %s) = %s\n", list.map(Fmt, [A, B, GCD]), !IO). 

Для компиляции и запуска на Windows (cmd.exe): Пожалуйста, обратите внимание, что ММС также командной системы Windows, так используйте среду ртути, при условии от инсталлятор Распределение ртути:

> mmc --use-grade-subdirs -m test_gcd 
> test_gcd 12 4 

Для компиляции и запуска на Linux/MacOS/и т.д. (любой Баш-как оболочка):

$ mmc --use-grade-subdirs -m test_gcd 
$ ./test_gcd 12 4 
+1

Вы должны иметь возможность использовать команду «mmc» для окон. (Мы поощряем это). –

+0

Спасибо @PaulBone, я переформулировал ответ. – Sebastian

1

Я прочитал в руководстве пользователя Mercury и узнал следующее:

$ "ММС -f module_1.m module_2.m" % без кавычек

$ "mmake module_2.depend"

$ "mmake module_2"

Он построил исполняемый module_2, который я выполнил

$»./module_2"

и он работал правильно. Когда все остальное не удается, прочитайте руководство.

+0

Я сказать, что руководство пользователя немного устарела в этом подходе, по моему опыту в качестве новичка Mercury, легче использовать автоматическое обнаружение зависимостей компилятора 'mmc', используя флаг' --make', как я показал в своем ответе. – Sebastian

+1

Себастьян прав. mmake не рекомендуется, и когда мы вводим новые функции, мы не сообщаем их в mmake. mmc -f не устарел, но полезен, когда ваши имена файлов не соответствуют вашим именам модулей или когда модули размещаются в каталогах, отличных от текущего каталога. Спасибо. –

Смежные вопросы