Заблокирован
1

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

14.02.2017, 18:02. Показов 2943. Ответов 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
Заблокирован
17.02.2017, 00:58  [ТС] 61
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от nullxdth Посмотреть сообщение
На CLOS, просто напишешь реализацию метода collide под объекты типов asterioid и beautiful-spaceship и все дела.
Можно и так сделать. Можно заранее вместо ифов нахреначить функций, набить их в массив, и там менять, добавлять -- это будет аналог. можно даже напрямую функцию модифицировать, она доступна в рантайме. это все не важно.
0
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
17.02.2017, 01:05 62
Цитата Сообщение от asmquest Посмотреть сообщение
ожно и так сделать. Можно заранее вместо ифов нахреначить функций, набить их в массив, и там менять, добавлять -- это будет аналог. можно даже напрямую функцию модифицировать, она доступна в рантайме. это все не важно.
Это будет, если будет, кривой аналоги мультиметодов. Тогда как в Lisp ничего не надо делать, просто бери и используй.
0
Эксперт функциональных языков программированияЭксперт Java
4479 / 2714 / 485
Регистрация: 28.04.2012
Сообщений: 8,582
17.02.2017, 01:16 63
Цитата Сообщение от asmquest Посмотреть сообщение
Дык ведь я доказывать ничего не собирался, интересно было самому разобраться Вердикт: я несу всякое бездоказательное говно, как обычно.
Fixed.

Добавлено через 1 минуту
Цитата Сообщение от asmquest Посмотреть сообщение
может
Не вижу доказательства. Очередное голословное утверждение.
0
Заблокирован
17.02.2017, 01:18  [ТС] 64
korvin_, ладно, мы тут побеседовали, и я осознал, что это может быть полезно, хотя не критично, и на Io реализуемо.
Короче хорош, у меня вторая бессонная ночь подряд. Посмотреть кинцо, успокоить нервы, и баиньки
0
Эксперт функциональных языков программированияЭксперт Java
4479 / 2714 / 485
Регистрация: 28.04.2012
Сообщений: 8,582
17.02.2017, 01:19 65
Цитата Сообщение от asmquest Посмотреть сообщение
и на Io реализуемо
Без-до-ка-за-тель-но-е пус-то-сло-ви-е.
0
117 / 53 / 2
Регистрация: 12.02.2017
Сообщений: 194
17.02.2017, 03:33 66
Цитата Сообщение от asmquest Посмотреть сообщение
Я ничего не понял
Блджад!, не удивительно =)

Добавлено через 6 минут
Цитата Сообщение от asmquest Посмотреть сообщение
Короче, я на сегодня закругляюсь, устал, не спал сутки. Завтра может гляну что ты там накалякал. Хотя, ты гонишь, вряд ли там что то интересное. Очередные фокусы.
Да нет. Просто не смеши публику своими недоразумениями.
0
Заблокирован
18.02.2017, 21:23  [ТС] 67
Цитата Сообщение от korvin_ Посмотреть сообщение
Без-до-ка-за-тель-но-е пус-то-сло-ви-е.
держи, сынок, реализацию, страшно сказать, священной коровы, в четыре сроки. Когда подрастешь, будешь своим детям и внукам показывать, как взрослые дяди -хакеры могут
Код
MultyMethod := List clone do(
     dispatch := method(args,
        argTypes := args map(type)
        self foreach(block, if(block argumentNames == argTypes, return block callWithArgList(args)))
     )
)

/////////////////////////////////////////////

Asteroid := Object clone 
SpaseShip := Object clone 

asteroid := Asteroid clone
spaceShip := SpaseShip clone


multyMethod := MultyMethod clone
collide := method(multyMethod dispatch(call evalArgs))

multyMethod push(block(Asteroid, SpaseShip, writeln("asteroid collide with spaceship")))
multyMethod push(block(SpaseShip, Asteroid,  writeln("spaceship collide with asteroid")))

collide(asteroid, spaceShip) #>>>>asteroid collide with spaceship
collide(spaceShip, asteroid) #>>>>spaceship collide with asteroid
0
Эксперт функциональных языков программированияЭксперт Java
4479 / 2714 / 485
Регистрация: 28.04.2012
Сообщений: 8,582
18.02.2017, 22:57 68
Цитата Сообщение от asmquest Посмотреть сообщение
держи, сынок, реализацию, страшно сказать, священной коровы, в четыре сроки. Когда подрастешь, будешь своим детям и внукам показывать, как взрослые дяди -хакеры могут
Ага, они поржут, что ты думаешь, будто хэшмап с ключом по кортежу типов является множетсвенной диспетчеризацией методов.

Код
...

BattleStar := SpaceShip clone
battleStar := BattleStar clone

collide(asteroid, battleStar) # Your shit doesn't work
collide(battleStar, asteroid) # Your shit doesn't work
0
Заблокирован
18.02.2017, 23:09  [ТС] 69
Цитата Сообщение от korvin_ Посмотреть сообщение
Your shit doesn't work
ты про наследование что-ли говоришь? про наследование -- это другой вопрос.

Можно сделать и с наседованием, только вот правила диспетчеризации будут экстрасложные и забубенные, я даже не представляю, как там нужно все разруливать в случае конфликта типов и подтипов. это неправильный подход, тут лисп обосрался как всегда, все переусложнили без надобности

Это типа того, как я видел где то пример на CL, где прога обсирается из-за того, что великий и могучий оптимизирует списки, приводя разные списки к одному, или что-то в этом роде. Из-за подобных уродливых хаков в программе на лиспе никогда нельзя рассчитывать н надежность
0
Эксперт функциональных языков программированияЭксперт Java
4479 / 2714 / 485
Регистрация: 28.04.2012
Сообщений: 8,582
18.02.2017, 23:28 70
Цитата Сообщение от asmquest Посмотреть сообщение
ты про наследование что-ли говоришь? про наследование -- это другой вопрос.
Это не другой вопрос. Без учёта наследования нет полиморфизма подтипов и «мультиметоды» твои не методы, а банальный хэшмап (T1, T2) -> proc

Цитата Сообщение от asmquest Посмотреть сообщение
только вот правила диспетчеризации будут экстрасложные и забубенные
Ну так это тебе не Hello World'ы писать.

Цитата Сообщение от asmquest Посмотреть сообщение
тут я со своим Io обосрался как всегда, ниасили
Что, даже сврхмощьность Io не помогла?

Цитата Сообщение от asmquest Посмотреть сообщение
Это типа того, как я видел где то пример на CL, где прога обсирается из-за того, что великий и могучий оптимизирует списки, приводя разные списки к одному, или что-то в этом роде. Из-за подобных уродливых хаков в программе на лиспе никогда нельзя рассчитывать н надежность
«В огороде бузина, а в Киеве — дядька».
0
Заблокирован
18.02.2017, 23:51  [ТС] 71
korvin_, я повторяю, технически проблемы тут никакой нет, есть isKindOf, аnchestors и другие средства для такой реализации. Но сложность подобного интерфейса себя не оправдывает. если такое вдруг понадобиться, мне проще будет запилить это для конкретного случая. ООП подход предполагает делать простое простым, а сложное -- возможным, но не наоборот.
А полиморфизм подтипов в Io и без того есть, не переживай

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

Добавлено через 6 минут
korvin_, да и перформанс это посадит, кстати говоря

Добавлено через 5 минут
Цитата Сообщение от korvin_ Посмотреть сообщение
Ну так это тебе не Hello World'ы писать.
сложность ради сложности не нужна
0
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.02.2017, 01:54 72
Цитата Сообщение от asmquest Посмотреть сообщение
не оправдывает именно из-за того, что впоследствии пользоваться им будет неудобно, нужно постоянно думать о возможных конфликтах типов и подтипов, учитывапя порядок аргументов и тп, бред короче, прямо противоположное нужному -- простоте.
У стандартного комбинатора достаточно простой алгоритм. Сначала методы сортируются лексикографическим образом (где, грубо говоря, в качестве алфавита каждого аргумента - иерархия классов) и далее выбирается первых подходящий метод. Этот алгоритм, в принципе, интуитивно понятен и используется во всех известных мне языках реализующих мультиметоды.

Добавлено через 5 минут
Цитата Сообщение от asmquest Посмотреть сообщение
сложность ради сложности не нужна
Когда действительно понадобятся мультиметоды (а таких задач на самом деле не мало), то костыли будут не лучшим и далеко не самым простым, в смысле поддержки, решением. А когда они тебе не нужны, то ты специализируешься по первому аргументу и получается одинаково по сложности, что и в ООП с message passing-ом.
0
Заблокирован
19.02.2017, 02:21  [ТС] 73
Цитата Сообщение от nullxdth Посмотреть сообщение
А когда они тебе не нужны, то ты специализируешься по первому аргументу и получается одинаково по сложности, что и в ООП с message passing-ом.
ну, там не по первому, а возможно и по двум получается
Код
collide(asteroid, spaceship) == asteroid collide(spaceship)
в message-passing - стиле тут для меня всмысле разруливания подтипов все однозначно, а вот в мультидиспетчеризации -- не особо.
0
Эксперт функциональных языков программированияЭксперт Java
4479 / 2714 / 485
Регистрация: 28.04.2012
Сообщений: 8,582
19.02.2017, 06:42 74
Цитата Сообщение от asmquest Посмотреть сообщение
А полиморфизм подтипов в Io и без того есть, не переживай
Только в твоё коде его нет. Как там тебе в луже сидится? Не простудись.
0
19.02.2017, 06:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.02.2017, 06:42
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

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

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