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

Мультидиспетчеризация в Лиспе

19.02.2017, 00:50. Показов 6130. Ответов 107

Студворк — интернет-сервис помощи студентам
Допустим, имеем иерархию
Code
1
2
3
4
5
6
7
Животное
   Млекопитающее
       Собака
       Кошка
   Земноводное
       Лягушка
       Змея
и добавлены следующие правила
Code
1
2
3
4
5
6
7
8
9
10
foo = multimethod
foo добавить случай: (x = Млекопитающее y = Земноводное, ...)
foo добавить случай: (x = Собака y = Лягушка, ...)
 
далее, допустим
 
шарик = новая Собака
квакалка = новая Лягушка
 
foo(шарик, квакалка)
Какой из случаев, тип или подтип должен выбрать диспетчер, и почему, какое этому семантическое основание

И что будет, если мы засунем в один мультиметод одновременно экземпляры типа и подтипа? Что должен сделать диспетчер в этом случае?

Насколько надежным будет приложение, с использованием такого инструмента, учитывая то, что программисту трудно постоянно быть в напряжении и отслеживать возможные конфликты?

И наконец, чем оправданна такая экстремальная забубенность? Есть ли реальные кейзы для этого, или это все сделано для галочки, и никто реально с этим сомнительным инструментом не связывается?

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

Добавлено через 5 минут
Цитата Сообщение от asmquest Посмотреть сообщение
И что будет, если мы засунем в один мультиметод одновременно экземпляры типа и подтипа? Что должен сделать диспетчер в этом случае?
и, если, допустим, будет еще и конфликт такого рода:

Code
1
2
foo(Тип Подтип)
foo(Подтип Тип)
Где тип и подтип подтипы одного типа(надтипа)
?

Не является ли это все неоправданным переусложнением? Стоит ли овчинка выделки?

Добавлено через 13 минут
Короче говоря, хочется получить четкую и ясную схему расстановки приоритетов при возникновении разного рода конфликтов, и ясное семантическое обоснование этой схеме с точки зрения проектирования
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.02.2017, 00:50
Ответы с готовыми решениями:

О Лиспе и гомоиконности
Ясно.

ООП в лиспе не обеспечивает синтаксическую абстракцию
Представим пример: theObject.copyDataTo(anotherObject) theObject.copyDataFrom(anotherObject) Это верный подход, потому что в...

Clojure Мультидиспетчеризация не по типам
что то я везде встречаю примеры мультидиспетчеризаци по типам. А как в лиспе диспетчеризовать не по типам, а по друзим вещам, по слотам,...

107
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.02.2017, 14:06
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от asmquest Посмотреть сообщение
слишком велика цена
Цена почти никакая. Ибо, Common Lisp спроектирован таким образом, что сложность дающая гибкость не торчит наружу и для простых вещей - делаешь просто, даже не зная о всех возможностях.
Цитата Сообщение от asmquest Посмотреть сообщение
гибкости в сравнению с message-passing нет
Ну можно конечно закрыть глаза и говорить - "вы всё врети", "гибкости нет" Но как показало обсуждение касательно логики collide, Io - не справился с задачей. И были предложены именно грязные хаки в обход ООП системы языка, которые ещё и не работают во многих необходимых ситуациях.
Цитата Сообщение от asmquest Посмотреть сообщение
Это не так. Там есть масса средств, которые позволяют изменить стандартную диспетчеризацию, например метод forward -- аналог noSuchMethod
Это примитивнейший механизм реализованный почти во всех ООП языках, который, по понятным причинам, не решает многих проблем.
Цитата Сообщение от asmquest Посмотреть сообщение
На самом деле, лисповское ООП гораздо ближе к жаба-вей, чем Io.
Как раз таки, не смотря на гнилые лозунги, Io ООП куда ближе к Java ООП, чем CLOS. В CLOS предложено решение принципиально отличающееся от message passing - разделение методов и классов. Фактически, с т.з. CLOS, что Java ООП, что Io ООП - на одном и том же уровне, с маленькой поправкой на динамику.

Т.е. в Io вообще нет ничего принципиально нового, только лозунги. Посему Io никому и не нужен. Тогда как Common Lisp - production ready решение для комплексных задач.
1
Заблокирован
19.02.2017, 14:17  [ТС]
Цитата Сообщение от nullxdth Посмотреть сообщение
Io - не справился с задачей
что значит не справился? Я показал реализацию мультидиспетчеризации в 4 строки. Только без наследования. Покажи мне как справится с этим хваленый лисп, кстати.

Наследование легко реализовать, но я не знаю всех тонкостей диспетчеризации по подтипам в лиспе, поэтому полный аналог я реализовать не могу, ты что спишь что-ли? Наивный, без учета указанных конфликтов -- 2 пальца об асфальт.
Цитата Сообщение от nullxdth Посмотреть сообщение
не решает многих проблем.
например?
Цитата Сообщение от nullxdth Посмотреть сообщение
принципиально отличающееся от message passing
там все тот же message-passing, спрятанный за скобъем. Синтаксис не влияет на семантику, от того что я буду писать
Code
1
2
3
message(object)
вместо
object message
ничего не изменится, помимо того, что типобезопасность просядет. Это как раз касаемо мнимого "разделение методов и классов"
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,765
Записей в блоге: 14
19.02.2017, 14:19
Цитата Сообщение от asmquest Посмотреть сообщение
А зачем в примере на решетке он это делает?
- а ты приведи код на решетке без этого класса.
0
Заблокирован
19.02.2017, 14:21  [ТС]
Цитата Сообщение от asmquest Посмотреть сообщение
ничего не изменится
точней изменится еще и то, что добавится уродство синтаксиса, потому что нет возможности строить чейны и всюду приходится пихать явные аргументы. Плюс типобезопасность, как я уже сказал. Вот в этом разница, а не в отсутствии сообщений, которые никуда не делись
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.02.2017, 14:31
Цитата Сообщение от asmquest Посмотреть сообщение
Допустим, сталкиваются 3 объекта. Но когда сталкиваются 3 объекта, они сталкиваются не сразу 3, а сначала 2, а потом 3-й. Если нам это без разницы, то все норм. Но если нам нужно это выразить, то в CL мы не сможем это сделать мультиметодами.
Никаких проблем.
После столкновения мы получаем объект - результат столкновения что-то с чем-то. Выражается элементарно.
Цитата Сообщение от asmquest Посмотреть сообщение
Имы, в итоге, получаем семантический разрыв
Семантический разрыв в заднице? Нет никаких проблем. Не нужно никаких функций. Всё отлично моделируется средствами CLOS.
Цитата Сообщение от asmquest Посмотреть сообщение
Это к вопросу неконсистентности лиспа, опять же.
Ты сначала разберись в семантике стандартного комбинатора хотя бы, прежде чем рассказывать про неконсистентость А то когда видишь то, что не понимаешь - это всегда выглядит непонятно и "неконсистентно", но это не означает что так оно и есть.

Добавлено через 1 минуту
Цитата Сообщение от asmquest Посмотреть сообщение
Только без наследования.
Звучит как: "Я вам показал человека - только без головы".

Добавлено через 57 секунд
Цитата Сообщение от asmquest Посмотреть сообщение
Покажи мне как справится с этим хваленый лисп, кстати.
Уже показали. С наследованием. Всё штатным образом, в терминах CLOS, без хаков.

Добавлено через 6 минут
Цитата Сообщение от asmquest Посмотреть сообщение
там все тот же message-passing, спрятанный за скобъем. Синтаксис не влияет на семантику, от того что я буду писать
Такое ощущение, что ты вообще не понимаешь о чём тебе говорят. Ещё раз давай - message passing - честный случай, CLOS реализует общий вариант. Когда нужен dispatching по одному аргументу, то всё так как в message passing, а когда нужно более чем по одному: в Lisp - делаешь не задумываясь в рамках CLOS, в Io - сосёшь и начинаешь городить адовы костыли в обход ООП системы. Чего тут не понятного, хз...
0
Заблокирован
19.02.2017, 14:33  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
а ты приведи код на решетке без этого класса.
я на решетке не пишу, не знаю всех тонкостей, но полагаю, что там просто на входы методов надо подавать типы Number, а не IExpression, как то так

Эта вот хрень, которая не делает ничего, помимо того что дублирует нативный Integer, или что там у них
Code
1
2
3
4
5
6
7
8
9
class Number : IExpression
{
    int value;
    public Number(int v) { value = v; }    
    public int Evaluate()
    {
        return value;
    }
}
явно тут ни к селу ни к городу, это тавтология

Добавлено через 1 минуту
Цитата Сообщение от nullxdth Посмотреть сообщение
Уже показали
что показали? Я говорю, реализацию покажи
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.02.2017, 14:34
Цитата Сообщение от asmquest Посмотреть сообщение
что показали? Я говорю, реализацию покажи
Реализацию чего? Твоих костылей? Это возможно, но зачем оно надо, когда есть CLOS?
0
Заблокирован
19.02.2017, 14:36  [ТС]
Цитата Сообщение от nullxdth Посмотреть сообщение
Ещё раз давай - message passing - честный случай, CLOS реализует
Еще раз. Ты реально лелеешь надежду на то, что в Io нельзя развернуть bar(foo) в foo bar и наоборот? Какой нахрен "общий случай?"

Добавлено через 1 минуту
Цитата Сообщение от nullxdth Посмотреть сообщение
Это возможно, но зачем оно надо, когда есть CLOS?
Просто ради интереса, дабы посмотреть, насколько хорош лисп в деле, а не на ляляканьях адептов, к вопросу его выразительных возможностей
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.02.2017, 14:38
Цитата Сообщение от asmquest Посмотреть сообщение
точней изменится еще и то, что добавится уродство синтаксиса, потому что нет возможности строить чейны
Правда что-ли? curry и compose: строй любые чейны, какие душе угодно. Хоть на функциях, хоть на методах. Всё будет выразительно и единообразно.

Добавлено через 36 секунд
Цитата Сообщение от asmquest Посмотреть сообщение
типобезопасность просядет
В каком месте?
0
Заблокирован
19.02.2017, 14:40  [ТС]
Цитата Сообщение от nullxdth Посмотреть сообщение
В каком месте?
в элементарном. Типы не проверяются. Никто не мешает вызвать eat(shit)
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.02.2017, 14:42
Цитата Сообщение от asmquest Посмотреть сообщение
Еще раз. Ты реально лелеешь надежду на то, что в Io нельзя развернуть bar(foo) в foo bar и наоборот? Какой нахрен "общий случай?"
Ну так реализуй мультиметоды уже, а не костыли городи.
Вот тебе в помощь: http://www.artima.com/weblogs/... ead=101605. Гвидо сделал на Python. Но нужно понимать, что его мультиметоды - хак, в обход существующей примитивной реализации ООП (такой же как в Io). Фактически с т.з. языка - функция. Но даже такое решение принимается.

Добавлено через 1 минуту
Цитата Сообщение от asmquest Посмотреть сообщение
в элементарном. Типы не проверяются. Никто не мешает вызвать eat(shit)
Когда не проверяются? В compile-time?
0
Заблокирован
19.02.2017, 14:43  [ТС]
Цитата Сообщение от nullxdth Посмотреть сообщение
строй любые чейны
так это же еще костылять надо, а в ООП искаропки

Кроме того, сомнительно, что так это просто. Покажи как построить
Code
1
theList map(increment) filter(>3) reduce(+) + 4
Добавлено через 59 секунд
Цитата Сообщение от nullxdth Посмотреть сообщение
Когда не проверяются? В compile-time?
Ты дурачка из себя корчишь?
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.02.2017, 14:44
Цитата Сообщение от asmquest Посмотреть сообщение
Просто ради интереса, дабы посмотреть, насколько хорош лисп в деле, а не на ляляканьях адептов, к вопросу его выразительных возможностей
На Common Lisp написана масса отличных библиотек. Можешь посмотреть, например, optima - реализация pattern matching-а. Это же не Io, на тему CL масса источников для обучения и понимания. И литература и код. Всё что хочешь.
0
Заблокирован
19.02.2017, 14:45  [ТС]
Цитата Сообщение от nullxdth Посмотреть сообщение
Ну так реализуй мультиметоды уже, а не костыли городи.
сразу после того, как ты покажешь реализацию мультиметодов без наследования не лиспе
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.02.2017, 14:45
Цитата Сообщение от asmquest Посмотреть сообщение
Ты дурачка из себя корчишь?
Нет. Порой сложно понять, что ты имеешь ввиду. Конкретизируй.
0
Заблокирован
19.02.2017, 14:47  [ТС]
Цитата Сообщение от nullxdth Посмотреть сообщение
Конкретизируй.
если я вызову foo bar, а foo не имеет слота bar, программа упадет. В твоем же случае bar(foo) -- молча проглотит
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,765
Записей в блоге: 14
19.02.2017, 14:48
Цитата Сообщение от asmquest Посмотреть сообщение
явно тут ни к селу ни к городу, это тавтология
- вот я и говорю: перепиши этот код на C# "без тавтологий". Насколько я понял, число необходимо "завернуть" в IExpression, т.к. калькулятор работает с IExpression-ами, а числа только возвращает.
0
Заблокирован
19.02.2017, 14:53  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
- вот я и говорю: перепиши этот код на C# "без тавтологий". Насколько я понял, число необходимо "завернуть" в IExpression, т.к. калькулятор работает с IExpression-ами, а числа только возвращает.
ну так зачем тогда это позиционировать как аналог того, что на лиспе он накалякал?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,765
Записей в блоге: 14
19.02.2017, 14:55
Цитата Сообщение от asmquest Посмотреть сообщение
если я вызову foo bar, а foo не имеет слота bar, программа упадет.
- а в Io? Что будет, если, к примеру, выполнить вот такой код:

Code
1
  Object clone := "hosed"
Добавлено через 1 минуту
Цитата Сообщение от asmquest Посмотреть сообщение
ну так зачем тогда это позиционировать как аналог того, что на лиспе он накалякал?
калякаешь ты. Он пишет. И это как раз тот случай, когда результат зависит от языка. На Лиспе он понятнее.
0
Заблокирован
19.02.2017, 14:58  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
Object clone := "hosed"
а при чем тут ошибка типизации?

Добавлено через 48 секунд
Цитата Сообщение от Catstail Посмотреть сообщение
И это как раз тот случай, когда результат зависит от языка. На Лиспе он понятнее.
его код не аналогичен тому, с чем он его сравнивает, это тупая подтасовка
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.02.2017, 14:58

Мультидиспетчеризация и полиморфизм
Поскольку мультидиспетчеризация является частным случаем перегрузки -- перегрузкой в рантайме, значит она подпадает под определение ad-hoc...

Структуры на Лиспе
Добрый ночи, форумчанин! Прошу помогите мне пожалуйста. Задача 4. На аптечном складе хранятся лекарства. Сведения о...

Пятнашки на лиспе
Помогите пожалуйста разобраться в коде. Как произвести ввод данных? (defstruct board r c cells) (defun board-size (board) ...

Списки на Лиспе
даны списки L1,L2,L3. Если L1 является префиксом L2, а L3 - суффиксом L2, то ответ yes, иначе - no. Есть программа на прологе. Работает...

«Организация вычислений в Лиспе»
Помогите пожалуйста решить: 2. Написать с помощью композиции условных выражений функции от четырех аргументов AND4(x1 x2 x3 x4) и OR4(x1...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
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. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru