В. Каков простой шаблон для создания двухмодульной программы Mercury? Module_1 определяет и экспортирует простую функцию или предикат. Module_2 импортирует функцию/предикат для вычисления полезного результата и выводит результат.
Создание многомодульных программ Mercury
Ответы (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
Я прочитал Руководство пользователя Mercury и узнал следующее:
$ "mmc -f module_1.m module_2.m" % без кавычек
$ "mmake module_2.depend"
$ "сделать модуль_2"
Он построил исполняемый файл module_2, который я выполнил.
$ "./модуль_2"
и он работал правильно. Когда ничего не помогает, прочитайте руководство.
mmc
с использованием флага --make
, как я продемонстрировал в своем отвечать.
- person Sebastian; 10.11.2014