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

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

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

Студворк — интернет-сервис помощи студентам
Представим пример:
Code
1
2
theObject.copyDataTo(anotherObject)
theObject.copyDataFrom(anotherObject)
Это верный подход, потому что в синтаксисе мы выражаем пассивную и активную сторону процесса, а благодаря этому, мы видим по коду, что происходит на самом деле
А теперь смотрим на то, что принято в лиспе:
Lisp
1
copy-data(object1, object2)
Кто куда копирует? Без знания реализации функции мы этого не знаем. Даже если мы сами писали эту функцию, мы все равно можем забыть порядок аргументов, и лезть каждый раз для уточнения. Нет возможности абстрагироваться от реализации, нет возможности синтаксического выражения пассивной и активной стороны, нет возможности распознать, кто кому отсылает сообщение.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.02.2017, 18:02
Ответы с готовыми решениями:

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

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

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

73
Заблокирован
17.02.2017, 00:58  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от nullxdth Посмотреть сообщение
На CLOS, просто напишешь реализацию метода collide под объекты типов asterioid и beautiful-spaceship и все дела.
Можно и так сделать. Можно заранее вместо ифов нахреначить функций, набить их в массив, и там менять, добавлять -- это будет аналог. можно даже напрямую функцию модифицировать, она доступна в рантайме. это все не важно.
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
17.02.2017, 01:05
Цитата Сообщение от asmquest Посмотреть сообщение
ожно и так сделать. Можно заранее вместо ифов нахреначить функций, набить их в массив, и там менять, добавлять -- это будет аналог. можно даже напрямую функцию модифицировать, она доступна в рантайме. это все не важно.
Это будет, если будет, кривой аналоги мультиметодов. Тогда как в Lisp ничего не надо делать, просто бери и используй.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
17.02.2017, 01:16
Цитата Сообщение от asmquest Посмотреть сообщение
Дык ведь я доказывать ничего не собирался, интересно было самому разобраться Вердикт: я несу всякое бездоказательное говно, как обычно.
Fixed.

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

Добавлено через 6 минут
Цитата Сообщение от asmquest Посмотреть сообщение
Короче, я на сегодня закругляюсь, устал, не спал сутки. Завтра может гляну что ты там накалякал. Хотя, ты гонишь, вряд ли там что то интересное. Очередные фокусы.
Да нет. Просто не смеши публику своими недоразумениями.
0
Заблокирован
18.02.2017, 21:23  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Без-до-ка-за-тель-но-е пус-то-сло-ви-е.
держи, сынок, реализацию, страшно сказать, священной коровы, в четыре сроки. Когда подрастешь, будешь своим детям и внукам показывать, как взрослые дяди -хакеры могут
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
18.02.2017, 22:57
Цитата Сообщение от asmquest Посмотреть сообщение
держи, сынок, реализацию, страшно сказать, священной коровы, в четыре сроки. Когда подрастешь, будешь своим детям и внукам показывать, как взрослые дяди -хакеры могут
Ага, они поржут, что ты думаешь, будто хэшмап с ключом по кортежу типов является множетсвенной диспетчеризацией методов.

Code
1
2
3
4
5
6
7
...
 
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  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Your shit doesn't work
ты про наследование что-ли говоришь? про наследование -- это другой вопрос.

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

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

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

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

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

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

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

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

Добавлено через 5 минут
Цитата Сообщение от asmquest Посмотреть сообщение
сложность ради сложности не нужна
Когда действительно понадобятся мультиметоды (а таких задач на самом деле не мало), то костыли будут не лучшим и далеко не самым простым, в смысле поддержки, решением. А когда они тебе не нужны, то ты специализируешься по первому аргументу и получается одинаково по сложности, что и в ООП с message passing-ом.
0
Заблокирован
19.02.2017, 02:21  [ТС]
Цитата Сообщение от nullxdth Посмотреть сообщение
А когда они тебе не нужны, то ты специализируешься по первому аргументу и получается одинаково по сложности, что и в ООП с message passing-ом.
ну, там не по первому, а возможно и по двум получается
Code
1
collide(asteroid, spaceship) == asteroid collide(spaceship)
в message-passing - стиле тут для меня всмысле разруливания подтипов все однозначно, а вот в мультидиспетчеризации -- не особо.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
19.02.2017, 06:42
Цитата Сообщение от asmquest Посмотреть сообщение
А полиморфизм подтипов в Io и без того есть, не переживай
Только в твоё коде его нет. Как там тебе в луже сидится? Не простудись.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.02.2017, 06:42

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

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

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

Найдите синтаксическую ошибку!
Написал подобие проги для нахождения корней методом хорд, но никак не могу найти ошибку: в строке 35 выдаёт Unit1.cpp(35): E2141...

Сделать синтаксическую ошибку
Всем привет) Помогите пожалуйста решить задачу: Исходный язык – подмножество Matlab Вход: function=main() r=5; x0=3; y0=-3; ...


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

Или воспользуйтесь поиском по форуму:
74
Ответ Создать тему
Новые блоги и статьи
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru