Заблокирован
|
||||||
1 | ||||||
ООП в лиспе не обеспечивает синтаксическую абстракцию14.02.2017, 18:02. Показов 2947. Ответов 73
Метки нет (Все метки)
Представим пример:
Код
theObject.copyDataTo(anotherObject) theObject.copyDataFrom(anotherObject) А теперь смотрим на то, что принято в лиспе:
0
|
14.02.2017, 18:02 | |
Ответы с готовыми решениями:
73
Реализация циклов на Лиспе, Вложенные циклы на Лиспе Наследовать абстракцию Создать синтаксическую форму Устранить синтаксическую ошибку |
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
||||||
14.02.2017, 18:31 | 2 | |||||
Активная, пассивная... Я вообще не пойму, зачем у вас две функции вместо одной. А если у вас будет две пассивных или одна какая-нибудь бенефактивная. Например, «бабушка вяжет варежки внуку» ― как вы своими точками напишете?
Впрочем, если охота
А сообщений в лисповом ООП внезапно и нет.
1
|
Заблокирован
|
|
14.02.2017, 19:07 [ТС] | 3 |
ООП без сообщений не бывает
А в чем проблема? Код
grandMa makeMittensFor(grandSon) Добавлено через 4 минуты Вообще, насколько я понял, это не эквивалент. Это Код
copyer.copyFrom(object1).to(object2) это как раз случай, когда 2 пассивные стороны, и одна активная
0
|
117 / 53 / 2
Регистрация: 12.02.2017
Сообщений: 194
|
||||||
14.02.2017, 19:41 | 4 | |||||
Значит всё кроме smalltalk вовсе не ООП. Внезапно! Снова!
Нет. Вот эквивалент:
0
|
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
|||||||||||
14.02.2017, 19:49 | 5 | ||||||||||
Бывает. Учите матчасть.
Хе. А для носков — новую функцию? Нееет, варежки — тоже объект. Три объекта и одно действие. А так:
Я только потом понял, что вы с точки зрения отправки сообщений: отправляет активный, получает пассивный. Ну в принципе, с точкой вы можете сделать два пассивных при активном. Не суть важно, всё равно сообщения не нужны. Это очевидный эквивалент
Я всё-таки плохо понимаю, кто у вас пассивный, кто — активный, но, видимо, вы начинаете улавливать суть функций. Функция (наверно, её можно назвать активной стороной в вашей терминологии) производит действие над своими аргументами (которые в таком случае пассивны). Это относится и к обычным функциям, и к генеричным.
0
|
117 / 53 / 2
Регистрация: 12.02.2017
Сообщений: 194
|
|
14.02.2017, 20:41 | 7 |
0
|
Заблокирован
|
|
14.02.2017, 21:20 [ТС] | 8 |
да, собственно говоря, функция -- частный случай объекта. О том и речь, что это ограничение. Если мы хотим сделать нашу grandMa полноценным объектом, у нее должно быть множество методов. Если мы делаем ее обычной функцией, это проблематично сделать. Поэтому, нам нужна тут ООП-нотация grandMa dosomething dosomethingelse etc, иначе нам придется пихать эту grandMa явным аргументом во все ее методы, и наш код превратится в понос.
Добавлено через 10 минут Либо наоборот, пихать в grandMa все ее методы в качестве коллбеков, типа grandMa(dosomething, object), а во что превращается такой стиль кода с коллбеками, мы все прекрасно знаем.
0
|
korvin_
|
15.02.2017, 08:48
#10
|
0
|
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
|
16.02.2017, 14:09 | 11 |
Угу. Настолько верный, что в C++ из-за таких-то "удобств" планируют ввести UFCS, как в Rust или D. В Common Lisp же, так называемый, UFCS by default.
Добавлено через 2 минуты Фактически, единственный случай когда точечка имеет смысл, это autocomplete в IDE. Собственно об этом и говориться в wiki статье по UFCS: Добавлено через 9 минут Ну да, если называть аргументы object1, object2 или foo, bar, baz, то конечно ничего не будет понятно. Тут точка вообще ничего не решает. Даже символы не экономит. А качестве примера могу привести метод join в Python с предложенным тобой блестящим именованием. Код
object1.join(object2) Код
join(object1, object2) Добавлено через 13 минут Оу. Ты запоздал с такими заявлениями Прошло то время, когда маркетологи рассказывали, что ООП - silver bullet. Добавлено через 14 минут Конечно, зато точечка есть Чёрт с ней с функциональностью и унификацией, хардкодним синтаксический special case, а потом будем думать, как его обойти
0
|
Заблокирован
|
|
16.02.2017, 15:46 [ТС] | 12 |
nullxdth, точка там не причем, можно в качестве разделителя использовать что угодно. Просто точка принята в большинстве языков
не вижу препятствий в реализации мультиметодов, хотя при динамической диспетчеризации они не нужны, и будут пятым колесом Добавлено через 11 минут Что то не понял сути возражения. Это как раз говорит против "функционального" стиля, людей он не устраивает, они хотят ООП-нотации. Добавлено через 2 минуты Вы уверены, что вы о UFCS говорите?
0
|
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
|
16.02.2017, 16:44 | 13 |
Да. Касательно Lisp там конечно нет такого понятия. Вызов метода/функции/макроформы выглядит одинаково. Это унифицировано и не создаёт никаких проблем. С точки зрения термина UFCS - в Lisp, можно сказать, что любой вызов - UFCS.
0
|
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
|
16.02.2017, 16:52 | 15 |
Хм. Что значит не нужны? Мультиметоды либо есть, либо их нет. Синтаксис:
Код
object#method(...) Добавлено через 1 минуту Нельзя, если мы говорим о Lisp. Добавлено через 1 минуту Ну, конечно, можно всякого сахара напилить. Только, конкретно в этом случае, не нужно - это мусор. Добавлено через 3 минуты Это понятно. Сути проблемы это не меняет. Я говорю про точку, ибо:
0
|
Заблокирован
|
|
16.02.2017, 16:53 [ТС] | 16 |
не нужны потому что любые их кейзы перекрываются обычной одиночной динамической диспетчеризацией, в более удобной форме
их можно реализовать отдельной библиотекой. Но не нужно. вот поэтому в лиспе нет UFCS. Он есть когда можно, а не когда нельзя
0
|
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
|
16.02.2017, 17:39 | 17 |
Ну то есть имеется странный adhoc синтаксис, который не удобен, вводят общий синтаксис. Если есть общее решение, которое не имеет проблем, частное решение не нужно. А в Lisp этого конечно нет, ибо изначально унифицировано и нет никаких проблем.
Добавлено через 22 секунды Покажи пример. Добавлено через 36 секунд Можно посмотреть на реализацию? Например, на Io Добавлено через 5 минут Ты путаешь причину со следствием. UFCS планируют вводить в C++ не из-за того, что это не удобно, а наоборот. А "method call syntax" в С++ есть изначально. Добавлено через 1 минуту В Lisp нет такого термина в принципе. Но если рассматривать с точки зрения определения - то, фактически, в Lisp всё UFCS. Именно это я изначально и сказал.
0
|
Заблокирован
|
|
16.02.2017, 18:40 [ТС] | 18 |
Код
#(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", /*космический корабль сталкивается с астероидом*/) ) ) Завтра может напишу, если время будет. Сегодня не в настроении, не выспался. Добавлено через 25 минут удобно -- это когда можно по разному, и так и сяк и эдак.
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 |
простыня будет в лиспе, у меня уже классы определены, а в примере с лиспом -- нет.
что, ифофобия что-ли? туфта это все, там есть куча вариантов, это лишь один из многих. Каков вопрос таков ответ. Все что можно сделать с мультидеспетчеризацией, можно и нужно без нее. Это костыль восполняющий отсутствие нормального ООП, не более. Добавлено через 1 минуту кстати, в лиспе все равно все комбинации описываются, кончайте свою демагогию, это смешно уже
0
|
16.02.2017, 18:48 | |
16.02.2017, 18:48 | |
Помогаю со студенческими работами здесь
20
Найти синтаксическую ошибку Выдаёт синтаксическую ошибку Найдите синтаксическую ошибку! Сделать синтаксическую ошибку Выдает синтаксическую ошибку Вывод в лиспе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |