• Lisp programming CLOS например Почему за столько лет существования CLOS она просочилась только как максимум в варианты Scheme и в другие диалекты лиспа(от Dylan до, местами, Clojure — хотя в последнем всё очень упрощено, если не сказать удебилено).

    Почему ни один мейнстримный язык не прикрутил к себе охуенную ОО-систему подобную CLOS? Ладно Java какая-нибудь, но вот прогрессивная хипстота, типа Ruby, или вон Scala какая-нибудь — а всё туда же, ООП как в 60х, как в Simula.
    ♡ recommended by @OCTAGRAM

Replies (12)

  • @lovesan, насколько я понимаю, это что-то типа тайплассов. И чо там прикольного, глобальный решатель и неоднозначности?
  • @max630, тайпклассов?
  • @lovesan, да
  • @max630, обобщенные функции плюс комбинаторы методов, плюс метаобъектный протокол, на котором всё это построено — единственное нормальное ООП.

    Классы типов хаскеля максимум отдаленно напоминают урезанный механизм выборки фактического метода в стандартном комбинаторе.
    Сравнивать даже некорректно.
  • @lovesan, ну даже этот "урезанный механизм" слишком сложен и местами недостаточно надёжен, что тогда говорить о полной системе.
  • @max630, CLOS очень продуманная. Вот например — в классах типов хаскеля при выборе инстанса может возникнуть неоднозначность? В CLOS не может, там четко указан порядок проверки аргументов(плюс, его можно менять).

    Сложная — ну это да. Тем не менее, в случае CLOS, ортогональность частей системы это нивелирует. В целом система очень сложная, да, но совершенно необязательно врубаться во все ее узкие места, чтобы продуктивно использовать. Мы можем писать как на каком-нибудь C++ со статической перегрузкой методов(только в динамике, ессно), и в то же время, если надо, можем и в дебри метаобъектного протокола залезть и творить вообще что душе угодно, и не ломая всю систему при этом.
  • @lovesan, это определённость, подозреваю, сродно "определённости" i++ + ++i в жабе — определённость есть а счастья нет. Правила разрешения должны быть простыми
  • @max630, да не, там все просто, если про выборку мультиметода:
    1) Стандартно аргументы проверяются справа-налево, но можно менять для каждой обобщенной функции.
    2) Значение(спецификатор (eql значение)) более специфично чем класс(спецификатор — имя класса), ну а классы — более или менее специфичны в соответствии с CPL(class precedence list каждого класса, топологически отсортированная(в соответствии с простыми правилами) иерархия классов).
    3) Метод у которого аргументы более специфичны, при проверке в соответствии с порядком(см 1.) — более специфичен(тафтология, но как есть). Методы выстраиваются в сортированный список, и передаются в комбинатор методов, который уже определяет как их вызывать. Всё просто и логично, вощемта.
  • @lovesan, Сам бы взялся реализовывать?
  • @OCTAGRAM, да я вон пишу свой лисп, там ОО типа CLOS
    там то ее запустить легко
    сложно оптимизировать
  • @lovesan, "так то
  • @lovesan, Да для Лиспа–то оно нахрен не нужно, всё равно в Dylan (и CL) уже есть. А вот чтобы это была библиотека, с API и ABI, как у Microsoft COM, IBM SOM, Apple Objective-C runtime и Microsoft WinRT — вот это было бы интереснее. IBM SOM пока что круче всех, но версию под Windows мне так и не удалось раздобыть.