LINUX.ORG.RU

Аналог java-аннотаций в CLOS

 , , ,


1

2

У меня возникла потребность в странном и я решил вместо написания однотипных методов генеровать их силами MOP. Для удовлетворения почти всех моих потребностей хватает информации о названии и типе слота, но в некоторых случаях мне хотелось бы получить дополнительную информацию. Например, можно ли изменять значение слота или нет.

На жабе я бы пометил такое поле с помощью какой-нибудь аннотации, например @DontUpdateThisField.

А можно ли сделать что-то подобное средствами CLOS?


На жабе я бы пометил такое поле с помощью какой-нибудь аннотации, например @DontUpdateThisField

Тебе нужен свой метакласс в котором ты можешь прикрутить к полям любые желаемые атрибуты.

no-such-file ★★★★★
()
Ответ на: комментарий от basp

По сути - оно, но как-то слишком радикально.

nerh
() автор топика
Ответ на: комментарий от dave

Помучавшись, я решил свою проблему создав метакласс matainfo-aware-class, слоты которого cодержат слот metainfo, хранящий дополнительную информацию: @pastebin.

Как я понимаю, метаклассы не наследуются?

nerh
() автор топика
Ответ на: комментарий от nerh

По-моему должны наследоваться, но я не проверял. Просто должен соблюдаться протокол, а он во многом состоит из методов обобщенных функций. По идее, они или должны перекрываться, или будут вызваны методы для метакласса-предка. Это я так понимаю, но надо проверять.

dave ★★★★★
()
Ответ на: комментарий от dave

У меня то просто такие действия приводят к сообщению о несовместимости классов и необходимости создания соответсвующего validate-superclass метода:

(defclass a () () (:metaclass metainfo-aware-class))
(defclass b (a) ())

При этом проблема решается путем явного ообъявления метакласса для b.

Похоже, что метакласс не наследуется и по умолчанию в качестве него выступает standard-class (spec), что выглядит довольно уныло. Впрочем, попробую поковыряться еще в MOP, вдруг найдется метод повозволяющий реализовать и наследования метакласса.

nerh
() автор топика
Ответ на: комментарий от nerh

А ты вот какой метакласс имел в виду?! Я думал о наследовании самого метакласса как класса самого по себе. В твоем случае возможно, что и нет.

dave ★★★★★
()
Ответ на: комментарий от nerh

вдруг найдется метод повозволяющий реализовать и наследования метакласса

Возможно, что и не найдется. Во всяких AllegroGraph и CL-SQL используются свои макросы (defclass* и define-table-class, ЕМНИП). Возможно не только поэтому, но все же.

korvin_ ★★★★★
()
Ответ на: комментарий от korvin_

Как я понимаю, при определении класса будет вызван ensure-class-using-class, аргументами которого являются определяемый класс, его суперкласс и метакласс. Так что можно попробовать в нем вытягивать метакласс суперкласса и куда-нибудь его подсовывать. :)

nerh
() автор топика
Ответ на: комментарий от nerh

что выглядит довольно уныло

Дело в том, что метакласс может быть только один, а наследование множественным. Как тогда определять метакласс потомка с несколькими предками? По сути метакласс - это модификатор стандартного протокола для данного класса и вся иерархия классов должна задавать его явно. Запили себе макрос типа (def-annotate-class ...) и не заморачивайся.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Запили себе макрос типа (def-annotate-class ...) и не заморачивайся

Или можно использовать https://github.com/arielnetworks/cl-annot.git

@metaclass attributes-class
(defclass test (a b c)
   ((slot-a :accessor slot-a :initform nil :initarg :slot-a :attributes (:attrib1 "a-1" :attrib2 "a-2")))
monk ★★★★★
()
Ответ на: комментарий от monk

Все равно перед каждым классом нужно будет писать @metaclass attributes-class. Я предложил сделать макрос именно чтобы не повторять указание метакласса постоянно, т.к. он не наследуется.

no-such-file ★★★★★
()
Ответ на: Есть готовое от monk

Спасибо, я как раз почти то же самое сделал.

nerh
() автор топика
Ответ на: комментарий от monk

По моему с этим мороки куда больше, чем с определением макроса - везде писать (annot:enable-annot-syntax). Да и решает этот пакет гораздо больше задач, чем мне фактически нужно.

Так что cl-attribs + макрос, как предложил no-such-file, выглядит идеальным вариантом.

nerh
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.