6.3. Форматирование
Метод format создаёт неплохие представления примитивных типов данных для вывода. К примеру, хорошо бы отображать цвета, используя шестнадцатеричные числа. В этом представлении, основные цвета становятся 0x00FF0000 (красный), 0x0000FF00 (зелёный), и 0x000000FF (синий).
Тем не менее, если вы попытаетесь вывести эти значения, используя stdio::write/n, вы получите их в десятеричном базисе. Используя string::format/n, как показано ниже, вы получите распечатку примитивных цветов в шестнадцатеричном виде.
% File primtype2.pro
implement primtype2
open core
constants
className = "primtype2".
classVersion = "".
clauses
classInfo(className, classVersion).
class predicates
color:(symbol, integer) procedure (i, o).
clauses
color("red", 0x00FF0000) :- !.
color("blue", 0x000000FF) :- !.
color("green", 0x0000FF00) :- !.
color(_, 0x0).
run():- console::init(),
color("red", C),
S= string::format("%x\n", C),
stdio::write(S), stdio::nl,
succeed().
end implement primtype2
goal
mainExe::run(primtype2::run).
Первый аргумент функции format определяет, какой вы ходите видеть распечатку. В примере аргумент “%x\n”: вы хотите шестнадцатеричное отображение числа, завершающееся возвратом каретки (\n). Аргументы, следующие за первым, показывают данные, которые вы хотите напечатать.
Вот несколько примеров форматирования:
S= string::format("Pi=%4.3f\n", 3.14159) S= “Pi=3.142\n”
S= string::format("%4.3e\n", 33578.3) S= ”3.358e+004\n”
S= string::format("Fac(%d)=%d", 5, 120) S= “Fac(5)=120”
S= string::format("%s(%d)=%d", "f", 5, 120) S= “f(5)=120”
Спецификацией поля форматирования является %[-][0][width] [.precision][type], где дефис (‐) означает, что поле будет выровнено по левому краю, выравнивание по правому краю принято по умолчанию; ноль перед width заполняет форматированную строку нулями до тех пор, пока не будет достигнута минимальная ширина; width определяет минимальный размер поля; precision определяет точность числа с плавающей точкой; наконец, type может быть f (число с фиксированной точкой), e (научная запись действительных чисел), d (десятичное целое), x (шестнадцатеричное целое), o (восьмеричное). Строки отображаются как “%s”. Вы можете добавить любое сообщение в спецификацию формата; вы также можете добавить возврат каретки (“\n”).
6.4. Домены
Вам могут потребоваться иные типы данных кроме примитивов, предложенных Visual Prolog. В этом случае, вам нужно определить новые типы данных, которые вы будете помещать в ваш код.
6.4.1. Списки
Вы узнали, что списки это упорядоченные последовательности элементов. Вы также знаете, как создавать списочные домены и объявлять предикаты на списках. Например, вот несколько списочных доменов:
domains
reals= real*. % Список действительных чисел
integers= integer*. % Список целых чисел
strings= string*. % Список строк
rr= reals*. % Список списков действительных чисел
Когда у вас есть объявление домена, вы можете использовать его как любой другой примитивный тип. В случае списков, объявление домена не обязательно, так как можно использовать типы вроде real*, string* или integer* прямо в объявлении предиката.