(no subject)
Apr. 9th, 2009 02:24 amПотихоньку изучаю CLOS MOP. Отличная штука.
Хочу использовать для упрощения создания биндинга cl-gtk2.
Можно, например, с помощью MOP'а один раз написать универсальный конструктор (специализация make-instance), доступ к слотам (специализация slot-value-using-class, slot-boundp-using-class, slot-makunbound-using-class), и можно писать такие конструкции:
(defclass gtk-label () ((angle :g-property-name "angle" :allocation :gobject :accessor gtk-label-angle :g-property-type "gdouble") (label :allocation :gobject :g-property-name "label" :g-property-type "gchararray" :accessor gtk-label-label)) (:metaclass gobject-class) (:g-type-name . "GtkLabel"))
Записав такое определение, сразу получаем класс, привязанный к соотвествующему gobject-классу:
можно создавать объекты этого класса, и при создании gtk-label будет создаваться GtkLabel с нужными параметрами:
(defparameter *label* (make-instance 'gtk-label :angle 15.0 :label "Привет, мир!"))
сразу имеем доступ к слотам:
(gtk-label-label *label*) => "Привет, мир!"
Конечно, можно обойтись и без MOP (я использую генератор конструктора и функций доступа к слотам на основе макросов), но с MOP получается уж больно красиво и элегантно.
Еще надо разобраться с тем, как работают метаобъекты для обобщенных функций, и как-то суметь реализовать наследование классов от gobject-классов через MOP.
Надо еще убедиться, что MOP поддерживается хотя бы несколькими свободными реализациями лиспа в достаточном объеме.