Integer как object_identifier в Logtalk

У меня есть протокол студентов:

:- protocol(student).
    :- public([
        name/1,
        surname/1,
        studies/1,
        marks/1
    ]).
:- end_protocol.

Теперь я хочу сделать объект, имя которого является идентификатором (целое число), но когда я пытаюсь сделать это с create_object(18342, [implements(student)], [], [name(john), surname(smith), studies(it), marks(ok)]).

swilgt дает мне ошибку:

ОШИБКА: Ошибка типа: ожидается "object_identifier", найдено "18342" (целое число)

Ofc Я мог бы использовать кавычки, но я не хочу. Можно ли использовать целое число в качестве имени или я использую строку и добавляю id/1 в протокол?

1 ответ

Решение

Действительно (в настоящее время) невозможно использовать целое число в качестве идентификатора объекта. Одна альтернатива действительно использует атом, например '133' вместо 123, Не используйте строку, например "123" поскольку фактическое значение текста в двойных кавычках зависит от double_quotes стандартный флаг Пролог, единственное переносимое значение которого codes(т.е. "123" анализируется как [49,50,51],

Переносимый способ преобразования целого числа в атом - использование стандартных предикатов. number_codes/2 а также atom_codes/2 (или же number_chars/2 а также atom_chars/2). Некоторые поддерживаемые серверные системы Prolog также предоставляют собственные встроенные предикаты для прямого преобразования между числами и атомами.

Другие вопросы по тегам