Имя объекта как переменная в Logtalk
Возможно ли получить имя объекта как переменную? Я пытаюсь создать базу данных, где каждый объект представляет каждого человека. У меня есть объекты с [имя /1, фамилия /1], но когда я спрашиваю, например,
X:: имя (джон).
это дает мне ошибку. Ofc нет проблем, чтобы получить атом с помощью этого метода:
object_id:: имя (X).
1 ответ
::/2
управляющая конструкция отправки сообщений действительно требует связанного первого аргумента во время вызова. Но вы можете перечислить существующие объекты, используя current_object/1
встроенный предикат:
| ?- current_object(Person), Person::name(john).
...
Однако это решение может также привести к ошибкам, поскольку мы будем перечислять все объекты путем обратного отслеживания, и не все из них поймут name/1
сообщение. Таким образом, лучшим решением будет перечислять только те объекты, которые понимают name/1
сообщение. Предполагая, что все объекты, представляющие человека, реализуют (напрямую или через наследование) person_protocol
мы можем использовать conforms_to_protocol/2
встроенный предикат:
| ?- conforms_to_protocol(Person, person_protocol),
Person::name(john).
...
См. https://logtalk.org/manuals/refman/predicates/conforms_to_protocol_2_3.html для получения подробной информации.