+125
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
(closer-mop:defclass virtual-metaclass (closer-mop:standard-class) ())
(closer-mop:defclass virtual-slot-definition
(closer-mop:standard-slot-definition)
((function :initarg :function
:accessor virtual-slot-definition-function)))
(defmethod slot-definition-allocation ((slotd virtual-slot-definition))
:virtual)
(defmethod (setf slot-definition-allocation)
(allocation (slotd virtual-slot-definition))
(unless (eq allocation :virtual)
(error "Cannot change the allocation of a ~S"
'virtual-direct-slot-definition)) allocation)
(closer-mop:defclass virtual-direct-slot-definition
(closer-mop:standard-direct-slot-definition
virtual-slot-definition) ())
(defmethod closer-mop:direct-slot-definition-class
((class virtual-metaclass) &rest initargs)
;; Use virtual-direct-slot-definition if appropriate.
(if (eq (getf initargs :allocation) :virtual)
(find-class 'virtual-direct-slot-definition)
(call-next-method)))
(closer-mop:defclass virtual-effective-slot-definition
(closer-mop:standard-effective-slot-definition
virtual-slot-definition) ())
(defmethod closer-mop:effective-slot-definition-class
((class virtual-metaclass) &rest initargs)
;; Use virtual-effective-slot-definition if appropriate.
(let ((slot-initargs (getf initargs :initargs)))
(if (member :virtual-slot slot-initargs)
(find-class 'virtual-effective-slot-definition)
(call-next-method))))
(defmethod closer-mop:compute-effective-slot-definition
((class virtual-metaclass) name direct-slot-definitions)
;; Copy the function into the effective slot definition
;; if appropriate.
(let ((effective-slotd (call-next-method)))
(dolist (slotd direct-slot-definitions)
(when (typep slotd 'virtual-slot-definition)
(setf (virtual-slot-definition-function effective-slotd)
(virtual-slot-definition-function slotd))
(return)))
effective-slotd))
(defmethod closer-mop:slot-value-using-class
((class virtual-metaclass) object slot-name)
(let ((slotd (find slot-name (closer-mop:class-slots class)
:key 'closer-mop:slot-definition-name)))
(if (typep slotd 'virtual-slot-definition)
(funcall (cadr (virtual-slot-definition-function slotd)) :get object)
(call-next-method))))
(defmethod (setf closer-mop:slot-value-using-class)
(value (class virtual-metaclass) object slotd)
(if (typep slotd 'virtual-slot-definition)
;; This is ugly and probably not portable, but what if?
(funcall (cadr (virtual-slot-definition-function slotd))
:set object value)
(call-next-method)))
(defmethod closer-mop:slot-boundp-using-class
((class virtual-metaclass) object slot-name)
(let ((slotd (find slot-name (closer-mop:class-slots class)
:key 'closer-mop:slot-definition-name)))
(if (typep slotd 'virtual-slot-definition)
(funcall (cadr (virtual-slot-definition-function slotd)) :is-set object)
(call-next-method))))
(defmethod closer-mop:slot-makunbound-using-class
((class virtual-metaclass) object slot-name)
(let ((slotd (find slot-name (closer-mop:class-slots class)
:key 'closer-mop:slot-definition-name)))
(if (typep slotd 'virtual-slot-definition)
(funcall (virtual-slot-definition-function slotd) :unset object)
(call-next-method))))
О простоте объектно-ориентированого программирования, или страшная правда, которую от вас так долго скрывали.
Написано по мотивам: http://www.lispworks.com/documentation/lw50/LWUG/html/lwuser-173.htm В попытке сделать это, по возможности, портабельным (на SBCL вроде даже завелось).
Я понимаю, что читать это никто не будет, поэтому, краткий пересказ событий:
Захотелось мне виртуальных свойств, ну тоесть так, чтобы при обращении к Сипипишной библиотеке, для которой я ваяю оберкту не было различий между обычными Лисповыми объектами и Сипипишными.
Простой вариант - скопировать значения, но перформанс же!
И вот родился этот вариант. (Использование не показано, т.как не влезло).
Запостил: wvxvw,
12 Сентября 2014
gost 12.09.2014 20:33 # −1
guest 12.09.2014 20:40 # 0
Dummy00001 13.09.2014 13:05 # +1
closure mop?
клиента "закрыли" - и остатки с пола шваброй собирают?
wvxvw 13.09.2014 14:54 # 0
roman-kashitsyn 13.09.2014 15:42 # +4
О, эти отважные люди, лезущие в плюсовый ABI. Кмк, то, что они делают - бессмысленная борьба с неизбежным обломом и построение замков на костылях. Как минимум до тех пор, пока Саттер не протолкнёт свой extern "abi".
wvxvw 13.09.2014 16:35 # 0
Они даже SWIG интерфейс написали, который оказался даже на 90% годным.
Dummy00001 14.09.2014 01:46 # 0
пробовал много лет назад для перла пользоватся - что генерило не компилилось, а док кот наплакал.
wvxvw 14.09.2014 09:05 # 0
roman-kashitsyn 14.09.2014 22:46 # 0
У нас точно используется, но не в моём проекте (нам boost.python хватает).
bormand 14.09.2014 22:55 # +1
Реквестирую boost.javascript!
1024-- 14.09.2014 23:06 # 0
bormand 15.09.2014 05:28 # 0
chtulhu 15.09.2014 06:50 # 0
roman-kashitsyn 14.09.2014 23:28 # 0
Ага, сначала нужно запилить boost.js_impl. У пистона хотя бы есть де-факто стандартная реализация со стабильным нативным интерфейсом. А у каждого жс свой апи.
Вот boost.lua вполне реален, я даже удивлён, что такой штуки в бусте нет.
bormand 15.09.2014 05:34 # 0
Основные мысли вроде бы на любом движке можно выразить:
- умный указатель, знающий о GC
- какой-нибудь вариантный тип
- проброс крестофункции в жс
- проброс крестообъекта в жс
- обращение к массивам/объектам из крестов
- вызов жсной функции из крестов
- интерфейс для отладки с бектрейсом и переменными
Вот вроде и всё, что нужно для счастья.
eth0 13.09.2014 16:31 # +3