Как объект может быть классом lisp

Я пытался придумать для этого лучшее название, но не смог. Также каждая тема по этому поводу связана с python, и я не знаю python.

Я знаю, что dafult :meta-class - это standar-class

И что standard-object является экземпляром standard-class, и что каждый класс является экземпляром standard-class и наследует все от standard-object, но как это возможно? Например, как standard-object может быть объектом и суперклассом одновременно? Как это работает и почему?

Я не понимаю, как мгновенный класс может быть классом?

Какую документацию вы изучили, в чем они не справляются?

Ehvince 02.08.2018 01:02

поваренная книга lisp, документация по IDE lispworks, cs.cmu.edu/Groups/AI/html/cltl/clm/index.html и google ...

jakHunter 02.08.2018 01:04

Вы пробовали реализовать простой интерпретатор или систему классов? Если бы вы знали, то самозагрузка так же волшебна, как и рекурсия, и несколько парадоксальна. standard-object наследует standard-object

Sylwester 02.08.2018 01:44

Нет, позвольте мне перефразировать свой вопрос, как объект может быть классом? Например, как мгновенный класс может быть классом?

jakHunter 02.08.2018 02:03

Как книга, в которой описывается, как писать книгу, может быть самой книгой? И почему?

Rainer Joswig 02.08.2018 07:55

Вы, вероятно, найдете ответы в «Искусстве протокола метаобъектов», они показывают, как устроен CLOS, и объясняют проблему начальной загрузки.

Ehvince 02.08.2018 12:14
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Принцип подстановки Лискова
Принцип подстановки Лискова
Принцип подстановки Лискова (LSP) - это принцип объектно-ориентированного программирования, который гласит, что объекты суперкласса должны иметь...
0
7
185
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Один из способов подумать об этом - забыть, что самозагрузка - это проблема, и представить себе, что объектная система «именно такая», и тогда кажется естественным, что:

  • все является объектом
  • каждый объект является экземпляром класса
  • каждый (стандартный) класс является подклассом standard-object
  • класс - это объект
  • каждый стандартный класс - это объект, который является экземпляром standard-class
  • standard-class - это стандартный класс, который является объектом, который является экземпляром standard-class, и подклассом standard-object, который является классом, который является объектом, который является экземпляром standard-class.

Я попытался найти хорошую диаграмму, но не смог.

Другой способ подумать об этом - о начальной загрузке. Как сделать так, чтобы это состояние появилось?

Один из способов - создать объект без существующего класса:

  1. Определитесь с расположением в памяти объектов
  2. Зная, как разместить экземпляр standard-class в памяти, выделите экземпляр, который станет классом standard-class.
  3. Инициализируйте этот экземпляр правильными вещами. Установите его класс на себя. Еще не устанавливайте суперклассы
  4. Сделайте то же самое, чтобы выделить экземпляр, который станет standard-object (и другими частями иерархии, например, class, класс T, generic-function, method и т. д.)
  5. Класс всех этих объектов может быть установлен на standard-class.
  6. Подключите отношения иерархии классов
  7. Создавайте универсальные функции и методы для выделения экземпляров и компиляции универсальных функций и т. д.
  8. Добро пожаловать в вашу новую объектную систему
Ответ принят как подходящий

Вы могли бы задать себе обратный вопрос: почему класс не может быть объектом на объектно-ориентированном языке программирования?

Что такое класс? Это что-то, что содержит информацию о том, как создавать новые объекты, такие как поля, значения по умолчанию и т. д. В ООП инструмент по умолчанию для хранения данных вместе - это объект. Итак, классы CL - это просто объекты! И поскольку классы сами по себе являются объектами, конечно, у них есть класс STANDARD-CLASS (STANDARD-OBJECT - это прямой суперкласс класса без каких-либо других суперклассов… см. Структура наследования классов метаобъектов).

В качестве упражнения вы можете попытаться создать свою собственную (очень простую) объектную систему и очень быстро обнаружите, что если ваши классы являются объектами, это облегчит вашу жизнь. Исходя из этого, возникает лишь небольшая проблема с начальной загрузкой. :-)

Я думаю, что приемлемым ответом на «что такое класс» может быть либо «класс существует только во время компиляции и преобразуется в специализированные вызовы функций и vtable», либо «класс - это особая вещь, не относящаяся к среде выполнения, на которую можно ссылаться. только по имени [и может быть рассмотрен ...] »

Dan Robertson 02.08.2018 21:01

Вы, безусловно, очень помогли, я также прочитал stackoverflow.com/questions/12815105/…, и он ответил на мой следующий вопрос, но у меня есть вопрос по этому поводу. Стандартный класс - это, по сути, корневое право? Затем у нас есть standard-object, который сам является экземпляром standard-class, и после этого у нас есть отдельный объектный класс standard-class, который является экземпляром стандартного класса и подклассом standard-object, верно? Мне потребовалось много времени, чтобы осознать это.

jakHunter 03.08.2018 16:36

Я думаю, это сбивает с толку, но только из-за начальной загрузки и реализации. Ваше описание правильное, но я думаю, что корень - это standard-object, потому что это суперкласс по умолчанию для любого класса без явных суперклассов. Это означает: создайте standard-object, затем создайте standard-class, затем установите класс standard-object как standard-class, сделайте то же самое для standard-class. Когда вы наблюдаете за конечным результатом, это сбивает с толку ...

Nowhere man 06.08.2018 08:42

Другие вопросы по теме