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

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

19.02.2017, 00:50. Показов 6211. Ответов 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,766
Записей в блоге: 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,766
Записей в блоге: 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,766
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru