Форум программистов, компьютерный форум, киберфорум
Священные войны
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/16: Рейтинг темы: голосов - 16, средняя оценка - 4.56
Заблокирован
1

ООП в лиспе не обеспечивает синтаксическую абстракцию

14.02.2017, 18:02. Показов 2947. Ответов 73
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Представим пример:
Код
theObject.copyDataTo(anotherObject)
theObject.copyDataFrom(anotherObject)
Это верный подход, потому что в синтаксисе мы выражаем пассивную и активную сторону процесса, а благодаря этому, мы видим по коду, что происходит на самом деле
А теперь смотрим на то, что принято в лиспе:
Lisp
1
copy-data(object1, object2)
Кто куда копирует? Без знания реализации функции мы этого не знаем. Даже если мы сами писали эту функцию, мы все равно можем забыть порядок аргументов, и лезть каждый раз для уточнения. Нет возможности абстрагироваться от реализации, нет возможности синтаксического выражения пассивной и активной стороны, нет возможности распознать, кто кому отсылает сообщение.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.02.2017, 18:02
Ответы с готовыми решениями:

Реализация циклов на Лиспе, Вложенные циклы на Лиспе
1)реализовать двумя способами (LET, LOOP, DO, DOTIMES) первая картинка 2)Согласно варианту...

Наследовать абстракцию
как Наследовать абстракцию, чтобы наследник тоже не был абстракцией? И получить доступ к его...

Создать синтаксическую форму
Здравствуйте. Помогите, пожалуйста, создать синаксическую форму следующего вида: (ВЫПОЛНИТЬ...

Устранить синтаксическую ошибку
при использовании этого участка кода выдает ошибку: Syntax Error : invalid sytax и стрелкой...

73
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
14.02.2017, 18:31 2
Активная, пассивная... Я вообще не пойму, зачем у вас две функции вместо одной. А если у вас будет две пассивных или одна какая-нибудь бенефактивная. Например, «бабушка вяжет варежки внуку» ― как вы своими точками напишете?

Впрочем, если охота
Lisp
1
(copy-data :from object1 :to object2)
Кто копирует? copy-data. Откуда? Из object1. Куда? В object2.

А сообщений в лисповом ООП внезапно и нет.
1
Заблокирован
14.02.2017, 19:07  [ТС] 3
Цитата Сообщение от helter Посмотреть сообщение
А сообщений в лисповом ООП внезапно и нет.
ООП без сообщений не бывает
Цитата Сообщение от helter Посмотреть сообщение
бабушка вяжет варежки внуку
А в чем проблема?
Код
grandMa makeMittensFor(grandSon)
Цитата Сообщение от helter Посмотреть сообщение
А если у вас будет две пассивных
это когда пассивный обхаживает пассивного? Ну дык, он в активной роли только может быть. Как Вы себе это представляете?

Добавлено через 4 минуты
Цитата Сообщение от helter Посмотреть сообщение
(copy-data :from object1 :to object2)
Вообще, насколько я понял, это не эквивалент. Это

Код
copyer.copyFrom(object1).to(object2)
Добавлено через 7 минут
Цитата Сообщение от asmquest Посмотреть сообщение
Вообще, насколько я понял, это не эквивалент. Это
это как раз случай, когда 2 пассивные стороны, и одна активная
0
117 / 53 / 2
Регистрация: 12.02.2017
Сообщений: 194
14.02.2017, 19:41 4
Цитата Сообщение от asmquest Посмотреть сообщение
ООП без сообщений не бывает
Значит всё кроме smalltalk вовсе не ООП. Внезапно! Снова!
Цитата Сообщение от asmquest Посмотреть сообщение
Вообще, насколько я понял, это не эквивалент. Это
Нет. Вот эквивалент:
C
1
LispObjectPtr Copy (LispObjectPtr From, LispObjectPtr To)
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
14.02.2017, 19:49 5
Цитата Сообщение от asmquest Посмотреть сообщение
ООП без сообщений не бывает
Бывает. Учите матчасть.

Цитата Сообщение от asmquest Посмотреть сообщение
А в чем проблема?
Код
grandMa makeMittensFor(grandSon)
Хе. А для носков — новую функцию? Нееет, варежки — тоже объект. Три объекта и одно действие. А так:
Lisp
1
GrandmaKnitsMittensForGrandson()
я тоже умею, но камелкейс в качестве «синтаксической абстракции» ― вообще фигово.

Цитата Сообщение от asmquest Посмотреть сообщение
это когда пассивный обхаживает пассивного? Ну дык, он в активной роли только может быть. Как Вы себе это представляете?
Я только потом понял, что вы с точки зрения отправки сообщений: отправляет активный, получает пассивный. Ну в принципе, с точкой вы можете сделать два пассивных при активном. Не суть важно, всё равно сообщения не нужны.

Цитата Сообщение от asmquest Посмотреть сообщение
Вообще, насколько я понял, это не эквивалент. Это
Это очевидный эквивалент
Lisp
1
(copy-data object1 object2)
с именованными аргументами. А в примере с copyer у вас — два действия, у меня — одно.

Цитата Сообщение от asmquest Посмотреть сообщение
это как раз случай, когда 2 пассивные стороны, и одна активная
Я всё-таки плохо понимаю, кто у вас пассивный, кто — активный, но, видимо, вы начинаете улавливать суть функций. Функция (наверно, её можно назвать активной стороной в вашей терминологии) производит действие над своими аргументами (которые в таком случае пассивны). Это относится и к обычным функциям, и к генеричным.
0
Заблокирован
14.02.2017, 20:30  [ТС] 6
Неинтересно читать Ваши передергивания.

Добавлено через 3 минуты
Цитата Сообщение от helter Посмотреть сообщение
Хе. А для носков — новую функцию? Нееет, варежки — тоже объект. Три объекта и одно действие. А так:
можно и так
Код
grandMa make mittens for(grandSon)
grandMa make(mittens) for(grandSon)
Если это нужно. В ООП все можно, это ж не лишпик какой-нибудь там
0
117 / 53 / 2
Регистрация: 12.02.2017
Сообщений: 194
14.02.2017, 20:41 7
Цитата Сообщение от asmquest Посмотреть сообщение
В ООП все можно
И в чем проблемы? Что-то вызывает зуд?
0
Заблокирован
14.02.2017, 21:20  [ТС] 8
Цитата Сообщение от helter Посмотреть сообщение
Функция (наверно, её можно назвать активной стороной в вашей терминологии) производит действие над своими аргументами (которые в таком случае пассивны). Это относится и к обычным функциям, и к генеричным.
да, собственно говоря, функция -- частный случай объекта. О том и речь, что это ограничение. Если мы хотим сделать нашу grandMa полноценным объектом, у нее должно быть множество методов. Если мы делаем ее обычной функцией, это проблематично сделать. Поэтому, нам нужна тут ООП-нотация grandMa dosomething dosomethingelse etc, иначе нам придется пихать эту grandMa явным аргументом во все ее методы, и наш код превратится в понос.

Добавлено через 10 минут
Цитата Сообщение от asmquest Посмотреть сообщение
иначе нам придется пихать эту grandMa явным аргументом во все ее методы, и наш код превратится в понос.
Либо наоборот, пихать в grandMa все ее методы в качестве коллбеков, типа grandMa(dosomething, object), а во что превращается такой стиль кода с коллбеками, мы все прекрасно знаем.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,654
Записей в блоге: 13
14.02.2017, 21:45 9
asmquest, ты еще не понял?

Добавлено через 55 секунд
Цитата Сообщение от _JohnSmith Посмотреть сообщение
Что-то вызывает зуд?
- это вопрос к психологу...
0
korvin_
15.02.2017, 08:48
  #10

Не по теме:

Цитата Сообщение от _JohnSmith Посмотреть сообщение
Что-то вызывает зуд?
Недостаток внимания, обнимите его кто-нибудь. =)

0
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
16.02.2017, 14:09 11
Цитата Сообщение от asmquest Посмотреть сообщение
Это верный подход
Угу. Настолько верный, что в C++ из-за таких-то "удобств" планируют ввести UFCS, как в Rust или D. В Common Lisp же, так называемый, UFCS by default.

Добавлено через 2 минуты
Фактически, единственный случай когда точечка имеет смысл, это autocomplete в IDE. Собственно об этом и говориться в wiki статье по UFCS:
benefit of the method call syntax is use with 'dot-autocomplete' in IDEs
Со всех других сторон, "method call syntax" - это сомнительное ad hoc решение, которое порождает проблемы. Как пример: усложнение использования в ФВП и невозможность разделения методов и классов для реализации мультиметодов (как в CLOS).

Добавлено через 9 минут
Цитата Сообщение от asmquest Посмотреть сообщение
А теперь смотрим на то, что принято в лиспе
Цитата Сообщение от asmquest Посмотреть сообщение
Кто куда копирует?
Ну да, если называть аргументы object1, object2 или foo, bar, baz, то конечно ничего не будет понятно. Тут точка вообще ничего не решает. Даже символы не экономит.
А качестве примера могу привести метод join в Python с предложенным тобой блестящим именованием.
Код
object1.join(object2)
Где тут итератор, где сепаратор? И чем это по понятности, отличается от:
Код
join(object1, object2)


Добавлено через 13 минут
Цитата Сообщение от asmquest Посмотреть сообщение
В ООП все можно
Оу. Ты запоздал с такими заявлениями Прошло то время, когда маркетологи рассказывали, что ООП - silver bullet.

Добавлено через 14 минут
Цитата Сообщение от helter Посмотреть сообщение
А для носков — новую функцию?
Конечно, зато точечка есть Чёрт с ней с функциональностью и унификацией, хардкодним синтаксический special case, а потом будем думать, как его обойти
0
Заблокирован
16.02.2017, 15:46  [ТС] 12
nullxdth, точка там не причем, можно в качестве разделителя использовать что угодно. Просто точка принята в большинстве языков

Цитата Сообщение от nullxdth Посмотреть сообщение
для реализации мультиметодов (как в CLOS)
не вижу препятствий в реализации мультиметодов, хотя при динамической диспетчеризации они не нужны, и будут пятым колесом

Добавлено через 11 минут
Цитата Сообщение от nullxdth Посмотреть сообщение
Угу. Настолько верный, что в C++ из-за таких-то "удобств" планируют ввести UFCS, как в Rust или D.
Что то не понял сути возражения. Это как раз говорит против "функционального" стиля, людей он не устраивает, они хотят ООП-нотации.

Добавлено через 2 минуты
Цитата Сообщение от nullxdth Посмотреть сообщение
В Common Lisp же, так называемый, UFCS by default.
Вы уверены, что вы о UFCS говорите?
Universal Function Call Syntax is a programming language feature in D, Rust[1] and Nim that allows any function to be called using the syntax for method calls (as in object-oriented programming)
0
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
16.02.2017, 16:44 13
Цитата Сообщение от asmquest Посмотреть сообщение
Вы уверены, что вы о UFCS говорите?
Да. Касательно Lisp там конечно нет такого понятия. Вызов метода/функции/макроформы выглядит одинаково. Это унифицировано и не создаёт никаких проблем. С точки зрения термина UFCS - в Lisp, можно сказать, что любой вызов - UFCS.
0
Заблокирован
16.02.2017, 16:46  [ТС] 14
Цитата Сообщение от nullxdth Посмотреть сообщение
С точки зрения термина UFCS - в Lisp, можно сказать, что любой вызов - UFCS.
Я ничего не понял. С чего бы это ему быть таковым?

Добавлено через 1 минуту
Цитата Сообщение от nullxdth Посмотреть сообщение
Вызов метода/функции/макроформы выглядит одинаково
Дык ведь там то наоборот можно по разному
Код
foo(bar)
bar.foo()
bar.foo
0
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
16.02.2017, 16:52 15
Цитата Сообщение от asmquest Посмотреть сообщение
не вижу препятствий в реализации мультиметодов, хотя при динамической диспетчеризации они не нужны, и будут пятым колесом
Хм. Что значит не нужны? Мультиметоды либо есть, либо их нет. Синтаксис:
Код
object#method(...)
противоречит сути мультиметода.

Добавлено через 1 минуту
Цитата Сообщение от asmquest Посмотреть сообщение
Дык ведь там то наоборот можно по разному
Нельзя, если мы говорим о Lisp.

Добавлено через 1 минуту
Цитата Сообщение от nullxdth Посмотреть сообщение
Нельзя, если мы говорим о Lisp.
Ну, конечно, можно всякого сахара напилить. Только, конкретно в этом случае, не нужно - это мусор.

Добавлено через 3 минуты
Цитата Сообщение от asmquest Посмотреть сообщение
точка там не причем, можно в качестве разделителя использовать что угодно.
Это понятно. Сути проблемы это не меняет. Я говорю про точку, ибо:
Цитата Сообщение от asmquest Посмотреть сообщение
Просто точка принята в большинстве языков
0
Заблокирован
16.02.2017, 16:53  [ТС] 16
Цитата Сообщение от nullxdth Посмотреть сообщение
Хм. Что значит не нужны?
не нужны потому что любые их кейзы перекрываются обычной одиночной динамической диспетчеризацией, в более удобной форме
Цитата Сообщение от nullxdth Посмотреть сообщение
Мультиметоды либо есть, либо их нет.
их можно реализовать отдельной библиотекой. Но не нужно.
Цитата Сообщение от nullxdth Посмотреть сообщение
Нельзя, если мы говорим о Lisp.
вот поэтому в лиспе нет UFCS. Он есть когда можно, а не когда нельзя
0
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
16.02.2017, 17:39 17
Цитата Сообщение от asmquest Посмотреть сообщение
вот поэтому в лиспе нет UFCS. Он есть когда можно, а не когда нельзя
Ну то есть имеется странный adhoc синтаксис, который не удобен, вводят общий синтаксис. Если есть общее решение, которое не имеет проблем, частное решение не нужно. А в Lisp этого конечно нет, ибо изначально унифицировано и нет никаких проблем.

Добавлено через 22 секунды
Цитата Сообщение от asmquest Посмотреть сообщение
не нужны потому что любые их кейзы перекрываются обычной одиночной динамической диспетчеризацией, в более удобной форме
Покажи пример.

Добавлено через 36 секунд
Цитата Сообщение от asmquest Посмотреть сообщение
их можно реализовать отдельной библиотекой
Можно посмотреть на реализацию? Например, на Io

Добавлено через 5 минут
Цитата Сообщение от asmquest Посмотреть сообщение
Это как раз говорит против "функционального" стиля, людей он не устраивает, они хотят ООП-нотации.
Ты путаешь причину со следствием. UFCS планируют вводить в C++ не из-за того, что это не удобно, а наоборот. А "method call syntax" в С++ есть изначально.

Добавлено через 1 минуту
Цитата Сообщение от asmquest Посмотреть сообщение
в лиспе нет UFCS
В Lisp нет такого термина в принципе. Но если рассматривать с точки зрения определения - то, фактически, в Lisp всё UFCS. Именно это я изначально и сказал.
0
Заблокирован
16.02.2017, 18:40  [ТС] 18
Цитата Сообщение от nullxdth Посмотреть сообщение
Покажи пример.
Код
#(defgeneric collide (x y))
#
#(defmethod collide ((x asteroid) (y asteroid))
#  ;;астероид сталкивается с астероидом
#  )
#
#(defmethod collide ((x asteroid) (y spaceship))
#  ;;астероид сталкивается с космическим кораблем
#  )
#
#(defmethod collide ((x spaceship) (y asteroid))
#  ;;космический корабль сталкивается с астероидом
#  )
#
#(defmethod collide ((x spaceship) (y spaceship))
#  ;;космический корабль сталкивается с космическим кораблем
#  )


Asteroid := Object clone do(
  collide := method(o,
    if(o type == "Asteroid", /*астероид сталкивается с астероидом*/)
    if(o type == "Spaceship", /*астероид сталкивается с космическим кораблем*/)
  )
)
Spaceship := Object clone do(
  collide := method(o, 
   if(o type == "Spaceship", /*космический корабль сталкивается с космическим кораблем*/)
   if(o type == "Asteroid", /*космический корабль сталкивается с астероидом*/)
  )
)
Я вообще даже не представляю, что тут такого, видимо из-за скобочек простое кажется сложным.
Цитата Сообщение от nullxdth Посмотреть сообщение
Можно посмотреть на реализацию? Например, на Io
Завтра может напишу, если время будет. Сегодня не в настроении, не выспался.

Добавлено через 25 минут
Цитата Сообщение от nullxdth Посмотреть сообщение
UFCS планируют вводить в C++ не из-за того, что это не удобно, а наоборот. А "method call syntax" в С++ есть изначально.
удобно -- это когда можно по разному, и так и сяк и эдак.
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
16.02.2017, 18:41 19
Вау, простыня else if-ов от мастера CS. Вопрос, вопрос можно? А что если мы и диспетчеризацию типа первого аргумента будем делать внутри метода? Один большой-пребольшой метод с большой-пребольшой простынёй else if-ов на все комбинации типов. А мультинаследование можно реализовать умной расстановкой goto, соблюдающей топологическую сортировку классов.
0
Заблокирован
16.02.2017, 18:48  [ТС] 20
Цитата Сообщение от helter Посмотреть сообщение
простыня
простыня будет в лиспе, у меня уже классы определены, а в примере с лиспом -- нет.
Цитата Сообщение от helter Посмотреть сообщение
if-ов
что, ифофобия что-ли?
Цитата Сообщение от helter Посмотреть сообщение
Один большой-пребольшой метод с большой-пребольшой простынёй else if-ов на все комбинации типов. А мультинаследование можно реализовать умной расстановкой goto, соблюдающей топологическую сортировку классов
туфта это все, там есть куча вариантов, это лишь один из многих. Каков вопрос таков ответ.
Все что можно сделать с мультидеспетчеризацией, можно и нужно без нее. Это костыль восполняющий отсутствие нормального ООП, не более.

Добавлено через 1 минуту
Цитата Сообщение от helter Посмотреть сообщение
на все комбинации типов
кстати, в лиспе все равно все комбинации описываются, кончайте свою демагогию, это смешно уже
0
16.02.2017, 18:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2017, 18:48
Помогаю со студенческими работами здесь

Найти синтаксическую ошибку
В программе ошибка, в самой последней строке пишет, что надо ставить ";" перед "end", хотя она там...

Выдаёт синтаксическую ошибку
Всем привет, я только начинаю учить php. Решил написать небольшой скрипт. Вот мой код: При...

Найдите синтаксическую ошибку!
Написал подобие проги для нахождения корней методом хорд, но никак не могу найти ошибку: в строке...

Сделать синтаксическую ошибку
Всем привет) Помогите пожалуйста решить задачу: Исходный язык – подмножество Matlab Вход:...

Выдает синтаксическую ошибку
Здравствуйте. Только начал учить PHP. Смотрю видеоуроки. Дошел до 8 урока и при наборе кода выдало...

Вывод в лиспе
(defun main() (setq a 5) ;как вывести: a = 5? ) (main)


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru