LISP. Как объявить класс со своими методами и свойствами?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Как объявить класс со своими методами и свойствами?

LISP. Как объявить класс со своими методами и свойствами?

Ответ
Поиск в этой теме
Непрочитано 19.07.2011, 08:26 #1
LISP. Как объявить класс со своими методами и свойствами?
LastGraff
 
Томск
Регистрация: 13.07.2011
Сообщений: 81

Нашел, что в LISPе можно использовать свои классы и создаются они вроде так:
Код:
[Выделить все]
 (defclass AClass ()
  ( 
    (foo :initform 2) 
    (bar :initarg :bar)
  )
)
(setf lobj (make-instance 'AClass :bar 4))
(lobj 'foo) ;; reads slot -> 2
(lobj 'bar) ;; reads slot -> 4
(lobj 'bar 6) ;; sets slot -> 6
но результат -
;ошибка: no function definition: BAR

Может кто-то знает другой способ создания класса?
Просмотров: 7800
 
Непрочитано 19.07.2011, 09:12
#2
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Нашел, что в LISPе можно использовать свои классы
Это не в том LISP, который имеется в AutoCAD - здесь достаточно примитивный диалект.

А вообще "классы" и прочее связанное с объектно-ориентированным программированием чисто функциональному языку и не нужны. На мой взгляд. Просто лишняя трата ресурсов. Наслушавшись "доцентов с кандидатами" слишком многие непременно хотят "объекты", там, где можно обойтись простыми средствами (и не только в LISP). Горе от ума, называется.

Хотя, если "очень хочется, то можно". Надо "только" написать свои расширения.

Например, функции defclass, make-instance и т.п. Но в любом случае "функции класса", т.е. реализацию методов и установку свойств надо самому писать. Если какая-то функция не определена, то в любом диалекте будет сообщение наподобие "no function definition: BAR". Кто эту функцию будет описывать, И.Ф. Крузенштерн, что ли? А сообщение именно об ней, потому что её вызов первым встретился.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 19.07.2011, 09:32
#3
LastGraff


 
Регистрация: 13.07.2011
Томск
Сообщений: 81


Спасибо, значит мои сомнения подтвердились.
LastGraff вне форума  
 
Непрочитано 19.07.2011, 10:52
#4
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
А вообще "классы" и прочее связанное с объектно-ориентированным программированием чисто функциональному языку и не нужны.
полностью поддерживаю - но есть одно но - в автолиспе нету замыканий - и как следствие нельзя реализовать структуры по логике схожие с объектами (при желании конечно можно - парсингом списка symbol'ов - но сильно геморно). Хотя конечно классы в лиспе (функциональных языках) могут понадобятся либо для совместимости с классо-ориентированными языками, либо от незнания лиспа.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 19.07.2011, 10:54
#5
LastGraff


 
Регистрация: 13.07.2011
Томск
Сообщений: 81


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Хотя конечно классы в лиспе (функциональных языках) могут понадобятся либо для совместимости с классо-ориентированными языками, либо от незнания лиспа.
Мне ближе вторая причина)
LastGraff вне форума  
 
Непрочитано 19.07.2011, 10:54
#6
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
А вообще "классы" и прочее связанное с объектно-ориентированным программированием чисто функциональному языку и не нужны. На мой взгляд. Просто лишняя трата ресурсов. Наслушавшись "доцентов с кандидатами" слишком многие непременно хотят "объекты", там, где можно обойтись простыми средствами (и не только в LISP). Горе от ума, называется.
Согласен абсолютно - на фига в функциональном языке это надо?
Олег (jr.) вне форума  
 
Непрочитано 19.07.2011, 15:38
#7
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


нафига классы вообще нужны... ими же вообще никто не пользуется
gomer вне форума  
 
Непрочитано 19.07.2011, 18:58
#8
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от gomer Посмотреть сообщение
нафига классы вообще нужны... ими же вообще никто не пользуется
Очень даже нужны. И очень даже пользуются. Но надо с умом, на любом языке.

А в AutoLISP - действительно "нафига". Хотя и здесь мы же пользуемся объектной моделью и, соответственно, классами. Только в виде vla-функций, которые где-то внутри потрохов AutoCAD обращаются к свойствам и методам.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 20.07.2011, 07:24
#9
LastGraff


 
Регистрация: 13.07.2011
Томск
Сообщений: 81


Тогда может подскажете как создать динамически список, если у меня в переменной содержится его будущее имя в текстовом формате?
LastGraff вне форума  
 
Непрочитано 20.07.2011, 07:54
#10
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
очень даже пользуются
Агоа, чтоб нифига не делать вообще, в системах RAD
список создается просто:
Код:
[Выделить все]
 (setq lst '())
ну, и далее используя (cons atom lst) с reverse или (append lst (list atm)) (append lst1 lst2)
для коротких списков просто (list atm1 atm2 ... atmn)
gomer вне форума  
 
Автор темы   Непрочитано 20.07.2011, 08:11
#11
LastGraff


 
Регистрация: 13.07.2011
Томск
Сообщений: 81


Это понятно, но вот в чем проблема (особенно для человека который всегда программировал с использованием классов) у меня есть имя будущего списка в переменной A
Код:
[Выделить все]
 (setq A "list1")
и мне не надо создавать список с именем A, мне надо с именем list1
А имена берутся из БД по запросу и вытягиваются из XML, поэтому даже их количество неизвестно... Известно только что дублирования нет...
Следовательно конструкция
Код:
не подходит совсем
LastGraff вне форума  
 
Непрочитано 20.07.2011, 08:47
#12
Capiton


 
Регистрация: 11.03.2009
Тюмень
Сообщений: 109
<phrase 1=


Код:
[Выделить все]
 (setq A  "list1" ) 
(set (read A) '( 1 2 3))
Capiton вне форума  
 
Автор темы   Непрочитано 20.07.2011, 09:03
#13
LastGraff


 
Регистрация: 13.07.2011
Томск
Сообщений: 81


Спасибо, а как потом узнать, что именно в нем записано?
LastGraff вне форума  
 
Непрочитано 20.07.2011, 09:13
#14
Capiton


 
Регистрация: 11.03.2009
Тюмень
Сообщений: 109
<phrase 1=


Не вполне понятен смысл вопроса. Кому и для чего узнать?
возможно:
Код:
[Выделить все]
 (vl-symbol-value (read A))
LISP и так знает, если нужно Вам в процессе отладки - стандартные средства редактора вам в помощь(ПКМ+"изучить", например). А может пользователю нужно узнать?

Последний раз редактировалось Capiton, 20.07.2011 в 09:21.
Capiton вне форума  
 
Автор темы   Непрочитано 20.07.2011, 11:22
#15
LastGraff


 
Регистрация: 13.07.2011
Томск
Сообщений: 81


Суть такая:
читается XML где указаны типы объектов и их координаты. Средствами лиспа делаем примитивы в автокаде... если происходит изменение одного из примитивов (перемещение) то лисп должен высылать сообщение на сервер, что внесены коррективы. Проблема в том, что я работал раньше с ООП и лисп для меня несколько непонятен. Я бы просто сделал на каждый примитив элемент собственного класса и отслеживал бы его свойства и методы. А как это реализовать функционально пока не знаю...
LastGraff вне форума  
 
Непрочитано 20.07.2011, 11:52
#16
Capiton


 
Регистрация: 11.03.2009
Тюмень
Сообщений: 109
<phrase 1=


Не.. Это Вам не ко мне, а к гуру местным. С ООП у меня не очень, а с XML вообще никак. По тем крохам опыта, что у меня есть могу сказать, что для отслеживания событий служат реакторы, но работают они, в общем случае, коряво(хотя только для перемещения может и сгодятся). А еще создаётся впечатление, что к примитивам автокада Вы относите не только те объекты, которые действительно являются примитивами(зачем отслеживать перемещения примитивов, например отрезков, я себе не представляю). Возможно среда ObjectARX Вам лучше подойдёт, чем лисп. Там как раз полное ООП

P.S. Собираюсь начать разбираться с XML. Буду признателен, если вышлите какие-нибудь материалы по языку, (на правах "спасибо" или просто так). Адрес
capiton@yandex.ru
Capiton вне форума  
 
Непрочитано 20.07.2011, 12:01
#17
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


По xml или по работе с xml из-под Lisp'a? Если второе, то, например, http://kpblc.blogspot.com/2009/11/lisp-xml.html и http://kpblc.blogspot.com/2009/11/lisp-xml-2.html
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.07.2011, 12:12
#18
Capiton


 
Регистрация: 11.03.2009
Тюмень
Сообщений: 109
<phrase 1=


Спасибо.
Capiton вне форума  
 
Автор темы   Непрочитано 20.07.2011, 12:26
#19
LastGraff


 
Регистрация: 13.07.2011
Томск
Сообщений: 81


Цитата:
Сообщение от Capiton Посмотреть сообщение
(зачем отслеживать перемещения примитивов, например отрезков, я себе не представляю
в том то и дело, что отрезков

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
По xml или по работе с xml из-под Lisp'a? Если второе, то, например, http://kpblc.blogspot.com/2009/11/lisp-xml.html и http://kpblc.blogspot.com/2009/11/lisp-xml-2.html
я как раз с помощью этого и разобрался с XML теперь бьюсь с остальным)
LastGraff вне форума  
 
Непрочитано 20.07.2011, 14:08
#20
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от LastGraff Посмотреть сообщение
Суть такая:
читается XML где указаны типы объектов и их координаты. Средствами лиспа делаем примитивы в автокаде... если происходит изменение одного из примитивов (перемещение) то лисп должен высылать сообщение на сервер, что внесены коррективы. Проблема в том, что я работал раньше с ООП и лисп для меня несколько непонятен. Я бы просто сделал на каждый примитив элемент собственного класса и отслеживал бы его свойства и методы. А как это реализовать функционально пока не знаю...
1. Повесить либо один общий реактор на изменение документа, либо на каждый элемент в отдельности (если под каждый примитив надо генерировать отдельную функцию - без замыканих (которых нет в автолиспе) - то это геморно - я бы в большинстве случаев предпочел "общий" вариант - но в зависимости от предполагаемого использования). Данные о нахождении данных хранить либо в расширенных данных самого примитива (ИХМО - более предпочтительный вариант) - либо создавать отдельный список в памяти, либо "расширять" xml на "поле" имени примитива (как вариант можно рассмотреть подходит ли вариант индексации примитивов по сохраняемым признакам - тогда вобще никакие доп. данные не нужны - функция сама определит какую "nod'у" в XML изменить по состоянию до и после изменения).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Как объявить класс со своими методами и свойствами?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дробный текст методами LISP Nitrogenium LISP 1 08.02.2011 19:50
{Конкурс} Lisp. Задачки для студентов gomer LISP 10 05.01.2011 16:33
ГОСТ Р 53231-2008 UnyqUm Поиск литературы, чертежей, моделей и прочих материалов 5 15.09.2009 14:41
Хочу поделиться своими программками в LISP с желающими Olegic LISP 12 30.10.2004 22:52