Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
3 / 3 / 1
Регистрация: 29.03.2014
Сообщений: 60
1

ООП Common Lisp

06.11.2014, 18:27. Показов 1852. Ответов 11
Метки нет (Все метки)

Помогите пожалуйста!
Реализовать класс:
Программа (название, тип, сфера применения, язык программирования, ...)

Класс должен иметь методы для выполнения действий над объектами. Создать несколько экземпляров объектов. Активизировать методы.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.11.2014, 18:27
Ответы с готовыми решениями:

Книги или другой источник, где описана история версий Lisp и Common Lisp
Доброго времени суток.Такой вопрос,знаете какой-нибудь источник,где описана история версий Lisp и...

Common lisp
кто поможет решить эти задачи? Перечитайте правила форума. Один вопрос - одна тема. Заголовок...

Common lisp
Есть фрагмент программы: (defun game(x y) (cond (( < x y)(print "menshe")(setq y (read))) (( >...

Common Lisp
Подскажите пожалуйста, а может Common Lisp формировать списки из функций, и (если вдруг может) как?

11
4357 / 3364 / 342
Регистрация: 12.03.2013
Сообщений: 5,846
06.11.2014, 19:35 2
Лол, в лиспе класс не может иметь методы.

CLOS - это очень большая система, я его плоховато знаю.

Полиморфизм в лиспе существует за счёт генеричных функций (это я их так называю, на самом деле ― generic function, а по-русски - не знаю). Генеричная функция имеет имя и список аргументов и больше ничего. К ней привязаны методы - функции с такими же именами и списками аргументов, специализирующимися на определённых классах. Когда мы вызываем генеричную функцию (gen-fun a b), она проверяет классы аргументов a и b и применяет к ним наиболее специальный метод.

Класс сам по себе ― составной тип данных с несколькими полями (слотами). Типы данных образуют иерархию со множественным наследованием.

Функция slot-value осуществляет доступ к слоту. Однако её используют только для "приватных" слотов, а если доступ к слоту принадлежит к API класса, он осуществляется с помощью акцессора (или ридера, райтера).

Чтобы создать класс, используется макрос defclass. Вот простейший пример:

Lisp
1
2
3
(defclass program ()
  ((name :accessor program-name :initarg :name)
   (language :accessor program-language :initarg :language)))
Здесь сначала имя класса - program, потом в скобках родительские типы (никаких нету), потом в скобках слоты. Для слотов указан акцессор, так что если p - программа, то можно получить её имя через
Lisp
1
(program-name p)
или можно присвоить значение её языку:
Lisp
1
(setf (program-language p) "C++")
Экземпляр класса создаётся с помощью make-instance:
Lisp
1
(make-instance 'program :name "myprog" :language "C++")
Здесь происходит инициализация полей с помощью ключевых слов :name и :language, указанных в качестве :initarg-ов.

Если API класса предполагает создание пользователем объектов, нужно make-instance во что-то обернуть. То есть голый make-instance используется только в служебных целях.

Когда детей обучают ООП, им говорят, что при изменении свойств, вообще говоря, не только значения каких-то переменных доложны меняться, но и должно происходить что-то полезное. В контексте лиспа это означает, что часто не надо прописывать голый акцессор, а надо определять генеричную функцию. Например, в базовом классе program всё пусть останется как есть, а я на его основе создам класс loud-program, который будет выводить предупреждение при изменении имени программы:
Lisp
1
2
3
4
5
(defclass loud-program (program) ())
 
(defmethod (setf program-name) (name (p loud-program))
  (warn "Setting the name of ~A to ~A.~%" (program-name p) name)
  (call-next-method))
Класс loud-program всё наследует от program и не добавляет ничего нового. Однако для него мы определим отдельный сеттер. Здесь особенно интересен вызов call-next-method. Сейчас у нас есть два метода для сеттера (setf program-name): для объектов класса program и для объектов класса loud-program. Выбирается наиболее специальный. То есть если я буду сетфить для объекта класса loud-program, будет выбираться метод, который я только что вручную определил. Он, во-первых, делает предупреждение. А во-вторых, он вызывает следующий метод - то есть сеттер для класса program, который и выполняет фактическое присваивание.

Своими глазами можно убедиться, последовательно забивая в REPL:
Lisp
1
2
3
4
(setq *p* (make-instance 'loud-program :name "foo" :language "c"))
(program-name *p*)
(setf (program-name *p*) "myprog")
(program-name *p*)
Из чтения мне вот это было полезно: http://www.aiai.ed.ac.uk/~jeff/clos-guide.html

Я думаю, вопросов должно быть много, тем более CLOS довольно сильно отличается от "обычных" систем ООП. Так что давайте обсуждать!
4
3 / 3 / 1
Регистрация: 29.03.2014
Сообщений: 60
06.11.2014, 19:54  [ТС] 3
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
(defclass program ()
  ((name
    :initarg :name
    :initform (error "Must supply a program name."))
   (type
    :initarg :type
    :initform "void")
   (scope
    :initarg :scope
    :initform (error "Must supply a program name."))
   (language
    :initarg :language
    :initform "C#")))
Можно написать метод чтобы выводил все поля объекта данного класса?
1
4357 / 3364 / 342
Регистрация: 12.03.2013
Сообщений: 5,846
06.11.2014, 19:59 4
А как вы собираетесь обращаться к слотам? Сделайте акцессоры.

Добавлено через 2 минуты
Если хотите рид-онли слот (имя, например), то указывайте не :accessor, а :reader.
1
Эксперт Java
3295 / 2360 / 425
Регистрация: 28.04.2012
Сообщений: 7,865
06.11.2014, 20:01 5
Цитата Сообщение от helter Посмотреть сообщение
Функция slot-value осуществляет доступ к слоту. Однако её используют только для "приватных" слотов, а если доступ к слоту принадлежит к API класса, он осуществляется с помощью акцессора (или ридера, райтера)
Не обязательно только для приватных. Удобный макрос with-slots например раскрывается в вызовы slot-value.

Помнится, кто-то на ЛОРе делал сравнение скорости доступа к слотам структур и объектов с использованием slot-value и аксессоров. Вторые, конечно же, оказались быстрее. Аксессоры структур в свою очередь быстрее классовых аксессоров, т.к. первые являются обычными функциями, вторые -- методами, со всеми вытекающими плюсами и минусами. Интересно бы было сравнить производительность slot-value и метода-аксессора при большом количестве реализаций (переопределений) этого метода.
3
3 / 3 / 1
Регистрация: 29.03.2014
Сообщений: 60
06.11.2014, 20:09  [ТС] 6
Мне нужны более "полезные" методы чем смена имени программы.
0
Эксперт Java
3295 / 2360 / 425
Регистрация: 28.04.2012
Сообщений: 7,865
06.11.2014, 20:09 7
Цитата Сообщение от raigon Посмотреть сообщение
Можно написать метод чтобы выводил все поля объекта данного класса?
Например:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(defmethod print-object ((obj program) stream)
  (with-slots (name type scope language) obj
    (print-unreadable-object (obj stream :type t :identity t)
      (format stream "~s: ~a, scope: ~a, language: ~a" name type scope language))))
 
(defparameter *program-example*
  (make-instance 'program
                 :name  "Paint.NET"
                 :type  "Image editor"
                 :scope "Desktop"))
 
(print *program-example*)
 
; #<PROGRAM "Paint.NET": Image editor, scope: Desktop, language: C# 21CBBB13>
3
4357 / 3364 / 342
Регистрация: 12.03.2013
Сообщений: 5,846
06.11.2014, 20:15 8
Цитата Сообщение от korvin_ Посмотреть сообщение
Удобный макрос with-slots например раскрывается в вызовы slot-value.
Кажется, я всё-таки читал, что API следует организовывать без slot-value, но не могу нагуглить, где. Про обёртки не говорю.

Добавлено через 2 минуты
Цитата Сообщение от raigon Посмотреть сообщение
Мне нужны более "полезные" методы чем смена имени программы.
Вы предлагаете мне сесть и сделать Вашу лабораторную? Прежде чем накатывать Вам простыню, мне следовало бы глянуть на Ваши предыдущие сообщения на форуме.
1
4509 / 4217 / 356
Регистрация: 12.05.2012
Сообщений: 2,967
06.11.2014, 20:23 9
Пол Грэм ANSI Common Lisp (на русском)

11. CLOS 176

11.1. Object-Oriented Programming 176
11.2. Classes and Instances 179
11.3. Slot Properties 179
11.4. Superclasses 181
11.5. Precedence 182
11.6. Generic Functions 184
11.7. Auxiliary Methods 187
11.8. Method Combination 189
11.9. Encapsulation 190
11.10. Two Models 192

Добавлено через 4 минуты
на ozon.ru
4
Эксперт С++
5816 / 3468 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
07.11.2014, 17:56 10
Цитата Сообщение от helter Посмотреть сообщение
Полиморфизм в лиспе существует за счёт генеричных функций (это я их так называю, на самом деле ― generic function, а по-русски - не знаю)
«Обобщённых» же.
1
helter
07.11.2014, 18:42
  #11

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
«Обобщённых» же.
Обобщённый - это generali[z|s]ed. В математике обобщённые функции (generalized functions) - функции, которые обобщают обычные, то есть более общие. Generic functions не обобщают обычные (то есть обычные функции в лиспе не являются частным случаем generic functions). Словарь пишет:
http://www.oxfordlearnersdicti... sh/generic
generic shared by, including or typical of a whole group of things; not specific
‘Vine fruit’ is the generic term for currants and raisins.
То есть generic - относящийся к роду, genus. Такой же смысл у generic functions: есть класс функций, объединённых общим именем и схожим назначением, но действующих каждая в своём контексте; если же отвлечься от специфики и рассмотреть (как пишут в учебниках матана для перваков) "то общее, что есть у методов", получается generic function.

Но с "генеричный" я неправ. Сейчас загуглил и оказывается, что вполне себе существует слово "генерический", которое в основном встречается в фармацевтических контекстах, но есть и нужное значение
gallicismes.academic.ru/10510/генерический
В яблочко. Надо срочно читать Салтыкова-Щедрина. :D

0
4509 / 4217 / 356
Регистрация: 12.05.2012
Сообщений: 2,967
07.11.2014, 19:11 12
Как вариант: общие или родовые функции (как в биологии - классификация через общий род и видовые отличия)?
3
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.11.2014, 19:11

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Задача по COMMON LISP
Помогите пожалуйста написать полный код, в котором будет реализовываться функция MyReverseTree: то...

Common Lisp - Матрица
Помогите решить задачу! 1. Нужно написать функции генерации матрицы и ввода матрицы с клавиатуры...

Вопрос по common lisp
Подскажите пожалуйста как выполнить лисп-программу из txt или какого другого файла?

Программа на common lisp
Программа на common lisp Прочитать беззнаковое целое число из стандартного потока ввода и в каждом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.