[lisp]как шаблон в с++
От: Аноним  
Дата: 01.05.08 19:03
Оценка:
есть такой код с простой агрегацией:
(defclass A () (slot :accessor slot-of))
(defclass cell () (slot :initarg :slot))

(defmethod foo ((obj A))
(setf (slot-of obj) (mapcar (lambda (x) (make-instance 'cell :slot x)) '(1 2 3))))

затем надо получить наследника от A, отличающегося, возможно, только типом создаваемого в foo агрегируемого объекта:
(defclass sub-cell (cell) ())
(defclass B (A) ())

(defmethod foo ((obj B))
(setf (slot-of obj) (mapcar (lambda (x) (make-instance 'sub-cell :slot x)) '(1 2 3))))


как избежать здесь явного дуублирования?
в с++ это решалось в compile-time с помощью шаблонов, а как это можно сделать в лиспе?
Re: [lisp]как шаблон в с++
От: Turtle.BAZON.Group  
Дата: 05.05.08 04:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>как избежать здесь явного дуублирования?

А>в с++ это решалось в compile-time с помощью шаблонов, а как это можно сделать в лиспе?

Немного не понял. Тебе обобщённые методы нужны? Или лучше покажи как сделал бы н С++.
Re[2]: [lisp]как шаблон в с++
От: Аноним  
Дата: 05.05.08 11:25
Оценка:
Здравствуйте, Turtle.BAZON.Group, Вы писали:

TBG>Здравствуйте, Аноним, Вы писали:


А>>как избежать здесь явного дуублирования?

А>>в с++ это решалось в compile-time с помощью шаблонов, а как это можно сделать в лиспе?

TBG>Немного не понял. Тебе обобщённые методы нужны? Или лучше покажи как сделал бы н С++.

хочется на лиспе такого поведения:
template<class T=int> class A {
  T *slot;
public:
  A() {
    slot = new T;
  }
};

template<class T=char> class B : public A<T> {
  T *slot;
public:
  // какие-то дополнительные функции
};

//...
A<> a; 
A<char> aa; // переопределить тип T без создания пустого наследника
B<> b;
Re[3]: [lisp]как шаблон в с++
От: Turtle.BAZON.Group  
Дата: 05.05.08 15:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>A<char> aa; // переопределить тип T без создания пустого наследника


Ну если я правильно понял, то конкретно эту задачу можно сделать приблизительно так:

(defclass <cell> ()
  ((slot
     :initarg :slot)))

(defclass <sub-cell> (<cell>) ())

(defclass <A> ()
  ((T
     :type class
     :reader T
     :initarg :T)
   (slot :accessor slot-of)))

(defmethod new-instance ((obj <A>))
  (make-instance (T obj)))

(setf a (make-instance '<A> :T '<cell>))
(setf b (make-instance '<A> :T '<sub-cell>))

(format t "~&~A~%" (new-instance a))
(format t "~&~A~%" (new-instance b))


Вывод:

turtle@devel13:~/projects/turtle/education/lisp/genericity$ clisp genericity.lisp
#<<CELL> #x204AFB7E>
#<<SUB-CELL> #x204B444E>
Re[4]: [lisp]как шаблон в с++
От: Аноним  
Дата: 05.05.08 15:41
Оценка:
Здравствуйте, Turtle.BAZON.Group, Вы писали:

TBG>Здравствуйте, Аноним, Вы писали:


А>>A<char> aa; // переопределить тип T без создания пустого наследника


TBG>Ну если я правильно понял, то конкретно эту задачу можно сделать приблизительно так:

Но тогда подстановка происходит в runtime. Кроме того в каждом объекте будет храниться лишний атрибут, который кроме как в момент инициализации использоваться не будет..
Re[5]: [lisp]как шаблон в с++
От: Аноним  
Дата: 05.05.08 15:57
Оценка:
TBG>>Ну если я правильно понял, то конкретно эту задачу можно сделать приблизительно так:
А>Но тогда подстановка происходит в runtime. Кроме того в каждом объекте будет храниться лишний атрибут, который кроме как в момент инициализации использоваться не будет..
И еще один момент — в с++ наглядно видно, где слоты, а где спецификаторы шаблона. В вашем же коде на лиспе, этого явно указать не получится.
Re[6]: [lisp]как шаблон в с++
От: Turtle.BAZON.Group  
Дата: 07.05.08 07:48
Оценка:
Здравствуйте, Аноним, Вы писали:

TBG>>>Ну если я правильно понял, то конкретно эту задачу можно сделать приблизительно так:

А>>Но тогда подстановка происходит в runtime. Кроме того в каждом объекте будет храниться лишний атрибут, который кроме как в момент инициализации использоваться не будет..
А>И еще один момент — в с++ наглядно видно, где слоты, а где спецификаторы шаблона. В вашем же коде на лиспе, этого явно указать не получится.

Ну не знаю. В CLOS так не силён. Остаётся, конечно, последний выход — макрос...
Re[7]: [lisp]как шаблон в с++
От: MasterZiv СССР  
Дата: 07.05.08 08:44
Оценка: :))
Turtle.BAZON.Group пишет:
> Ну не знаю. В CLOS так не силён. Остаётся, конечно, последний выход —
> макрос...

Я вот нифига ничего не понял, что ты хотел написать на С++.
Там вообще бред какой-то.
Написал бы лучше — может бы кто и помог.
Posted via RSDN NNTP Server 2.1 beta
Re[8]: [lisp]как шаблон в с++
От: Turtle.BAZON.Group  
Дата: 08.05.08 06:22
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Я вот нифига ничего не понял, что ты хотел написать на С++.


Я на C++ ничего не хотел написать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.