Майк, оба ваших подхода вполне приемлемы, а плюсы и минусы каждого из них обсуждаются, как говорит Док Браун, во второй главе SICP.Первый страдает от наличия где-то большой таблицы типов, которую необходимо поддерживать.Второй - это просто традиционные таблицы однонаправленных полиморфизмов / виртуальных функций.
Причина, по которой схема не имеет встроенной системы, заключается в том, что использование неправильной объектной системы для проблемных отведенийко всем видам неприятностей, так что если вы дизайнер языка, какой выбрать?Одиночное наследование в одной посылке не справится с «множественными факторами, приводящими к полиморфному поведению, поэтому потенциально экспоненциально много разных комбинаций поведения».просто дает вам базовый инструментарий, из которого вы можете построить тот, который вам нужен.
В реальной программе схемы вы создадите свою объектную систему вручную, а затем скроете связанный шаблон с макросами.
В clojure у вас фактически есть встроенная система объектов / диспетчеризации, встроенная с помощью мультиметодов, и одним из ее преимуществ по сравнению с традиционным подходом является то, что он может выполнять диспетчеризацию по типам всех аргументов.Вы можете (по-видимому) также использовать систему иерархии для предоставления функций, подобных наследованию, хотя я никогда не использовал ее, поэтому вам следует взять это cum grano salis .
Но если вынужно что-то отличное от схемы объекта, выбранной разработчиком языка, вы можете просто сделать одну (или несколько) подходящую.
Это действительно то, что вы предлагаете выше.
Создайте то, что вам нужноПолучите все это, спрячьте детали с помощью макросов.
Аргумент между FP и OO не в том, плоха ли абстракция данных, а в том, является ли система абстракции данных местом, где нужно заполнить все отдельные проблемы:программа.
«Я считаю, что язык программирования должен позволять определять новые типы данных. Я не считаю, что программа должна состоять исключительно из определений новых типов данных».