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 также предоставляют собственные встроенные предикаты для прямого преобразования между числами и атомами.