Заблокирован
|
||||||
1 | ||||||
ООП в лиспе не обеспечивает синтаксическую абстракцию14.02.2017, 18:02. Показов 2943. Ответов 73
Метки нет (Все метки)
Представим пример:
Код
theObject.copyDataTo(anotherObject) theObject.copyDataFrom(anotherObject) А теперь смотрим на то, что принято в лиспе:
0
|
14.02.2017, 18:02 | |
Ответы с готовыми решениями:
73
Реализация циклов на Лиспе, Вложенные циклы на Лиспе Наследовать абстракцию Создать синтаксическую форму Устранить синтаксическую ошибку |
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
|
17.02.2017, 01:05 | 62 |
Это будет, если будет, кривой аналоги мультиметодов. Тогда как в Lisp ничего не надо делать, просто бери и используй.
0
|
4479 / 2714 / 485
Регистрация: 28.04.2012
Сообщений: 8,582
|
|
17.02.2017, 01:16 | 63 |
Fixed.
Добавлено через 1 минуту Не вижу доказательства. Очередное голословное утверждение.
0
|
4479 / 2714 / 485
Регистрация: 28.04.2012
Сообщений: 8,582
|
|
17.02.2017, 01:19 | 65 |
0
|
117 / 53 / 2
Регистрация: 12.02.2017
Сообщений: 194
|
|
17.02.2017, 03:33 | 66 |
Блджад!, не удивительно =)
Добавлено через 6 минут Да нет. Просто не смеши публику своими недоразумениями.
0
|
Заблокирован
|
|
18.02.2017, 21:23 [ТС] | 67 |
держи, сынок, реализацию, страшно сказать, священной коровы, в четыре сроки. Когда подрастешь, будешь своим детям и внукам показывать, как взрослые дяди -хакеры могут
Код
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
|
4479 / 2714 / 485
Регистрация: 28.04.2012
Сообщений: 8,582
|
|
18.02.2017, 22:57 | 68 |
Ага, они поржут, что ты думаешь, будто хэшмап с ключом по кортежу типов является множетсвенной диспетчеризацией методов.
Код
... 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 |
ты про наследование что-ли говоришь? про наследование -- это другой вопрос.
Можно сделать и с наседованием, только вот правила диспетчеризации будут экстрасложные и забубенные, я даже не представляю, как там нужно все разруливать в случае конфликта типов и подтипов. это неправильный подход, тут лисп обосрался как всегда, все переусложнили без надобности Это типа того, как я видел где то пример на CL, где прога обсирается из-за того, что великий и могучий оптимизирует списки, приводя разные списки к одному, или что-то в этом роде. Из-за подобных уродливых хаков в программе на лиспе никогда нельзя рассчитывать н надежность
0
|
4479 / 2714 / 485
Регистрация: 28.04.2012
Сообщений: 8,582
|
|
18.02.2017, 23:28 | 70 |
Это не другой вопрос. Без учёта наследования нет полиморфизма подтипов и «мультиметоды» твои не методы, а банальный хэшмап (T1, T2) -> proc
Ну так это тебе не Hello World'ы писать. Что, даже сврхмощьность Io не помогла? «В огороде бузина, а в Киеве — дядька».
0
|
Заблокирован
|
|
18.02.2017, 23:51 [ТС] | 71 |
korvin_, я повторяю, технически проблемы тут никакой нет, есть isKindOf, аnchestors и другие средства для такой реализации. Но сложность подобного интерфейса себя не оправдывает. если такое вдруг понадобиться, мне проще будет запилить это для конкретного случая. ООП подход предполагает делать простое простым, а сложное -- возможным, но не наоборот.
А полиморфизм подтипов в Io и без того есть, не переживай Добавлено через 3 минуты не оправдывает именно из-за того, что впоследствии пользоваться им будет неудобно, нужно постоянно думать о возможных конфликтах типов и подтипов, учитывапя порядок аргументов и тп, бред короче, прямо противоположное нужному -- простоте. Добавлено через 6 минут korvin_, да и перформанс это посадит, кстати говоря Добавлено через 5 минут сложность ради сложности не нужна
0
|
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
|
19.02.2017, 01:54 | 72 |
У стандартного комбинатора достаточно простой алгоритм. Сначала методы сортируются лексикографическим образом (где, грубо говоря, в качестве алфавита каждого аргумента - иерархия классов) и далее выбирается первых подходящий метод. Этот алгоритм, в принципе, интуитивно понятен и используется во всех известных мне языках реализующих мультиметоды.
Добавлено через 5 минут Когда действительно понадобятся мультиметоды (а таких задач на самом деле не мало), то костыли будут не лучшим и далеко не самым простым, в смысле поддержки, решением. А когда они тебе не нужны, то ты специализируешься по первому аргументу и получается одинаково по сложности, что и в ООП с message passing-ом.
0
|
Заблокирован
|
|
19.02.2017, 02:21 [ТС] | 73 |
ну, там не по первому, а возможно и по двум получается
Код
collide(asteroid, spaceship) == asteroid collide(spaceship)
0
|
4479 / 2714 / 485
Регистрация: 28.04.2012
Сообщений: 8,582
|
|
19.02.2017, 06:42 | 74 |
0
|
19.02.2017, 06:42 | |
19.02.2017, 06:42 | |
Помогаю со студенческими работами здесь
74
Найти синтаксическую ошибку Выдаёт синтаксическую ошибку Найдите синтаксическую ошибку! Сделать синтаксическую ошибку Выдает синтаксическую ошибку Вывод в лиспе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |