Создание многомодульных программ Mercury

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


person dogwood    schedule 09.11.2014    source источник


Ответы (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)).

Файл, использующий экспортированную функцию в модуле gcd (gcd/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): Обратите внимание, что mmc также является системной командой Windows, поэтому используйте среду Mercury, предоставляемую установщиком дистрибутива Mercury:

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

Чтобы скомпилировать и запустить в Linux/MacOS/и т. д. (любая оболочка, подобная Bash):

$ mmc --use-grade-subdirs -m test_gcd
$ ./test_gcd 12 4
person Sebastian    schedule 10.11.2014
comment
Вы должны иметь возможность использовать команду mmc в Windows. (Мы поощряем это). - person Paul Bone; 11.11.2014
comment
Спасибо @PaulBone, я переформулировал ответ. - person Sebastian; 12.11.2014

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

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

$ "mmake module_2.depend"

$ "сделать модуль_2"

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

$ "./модуль_2"

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

person dogwood    schedule 09.11.2014
comment
Я должен сказать, что руководство пользователя немного устарело в этом подходе, исходя из моего опыта новичка в Mercury, проще использовать автоматическое обнаружение зависимостей компилятора mmc с использованием флага --make, как я продемонстрировал в своем отвечать. - person Sebastian; 10.11.2014
comment
Себастьян прав. mmake устарел, и когда мы вводим новые функции, мы не добавляем их в mmake. mmc -f не является устаревшим, но он полезен только в том случае, если имена ваших файлов не совпадают с именами ваших модулей или когда модули размещены в каталогах, отличных от текущего каталога. Спасибо. - person Paul Bone; 11.11.2014