Какова цель системы типов в свете CLOS (Common Lisp)? - PullRequest
0 голосов
/ 25 февраля 2019

Насколько я понимаю, структура памяти объекта Common Lisp (побитовая маркировка определяется CLOS (классами).

Я понимаю, что каждый класс имеет соответствующий тип, но не каждый тип имеет соответствующийкласс, потому что типы могут быть составными (списки). Я думаю, что типы похожи на логические ограничения, в отличие от классов, которые являются конкретными "типами" со схемой тегирования.

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

Если это не правильно, какую цель выполняетСистема типов на самом деле служат в свете CLOS? Спасибо.

Ответы [ 5 ]

0 голосов
/ 28 февраля 2019

Я думаю, что важно уйти от реализации вещей, и вместо этого сосредоточиться на том, как язык думает о них.Очевидно, что реализация должна иметь достаточно информации, чтобы знать, что представляет собой данный объект, и она будет делать это с неким «тегом» (который может быть или не быть некоторыми дополнительными битами, прикрепленными к объекту - некоторые изэто могут быть, например, ведущие биты адреса).Ниже я назвал это «представительский тип».Но вы действительно почти не имеете доступа к этой детали реализации из языка.Заманчиво думать, что type-of говорит вам что-то, что отображает 1-1 на тип представления, но это не так: (type-of (cons 1 2) разрешено, например, возвращать (cons integer integer), и я думаю, что, вероятно, разрешено возвращать (cons integer number) или (cons (integer 1 1) (integer 2 2)).Маловероятно, что существуют разные репрезентативные типы для всех этих: действительно, не может быть, поскольку (type-of 1) может возвращать (integer m n) для бесконечного числа значений m & n.

Итак, рассмотрим, как язык думает о вещах, и различия между классами и типами в CL.

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

Классы

  • Классы являются первоклассными объектами (вы можете хранить класс внапример, переменная).
  • Все объекты (включая классы) принадлежат классу, и существует четко определенный оператор для нахождения непосредственного класса, к которому принадлежит любой объект.
  • Естьконечное число классов.
  • Класс объекта довольно близко соответствует его типу представления, но не полностью (могут быть специализированные типы массивов, которые, например, не имеют соответствующих классов).
  • Классы могут служить типами: (type-of 1 (class-of 1)) работает, как и (subtypep (class-of 1) '(integer 0 1)) (ответы: t и nil, t соответственно).

Типы

Типы - это способыобозначают коллекции объектов с общими свойствами, но сами они не являются объектами: они, во всяком случае, просто имена для коллекций вещей - спецификация языка называет эти «спецификаторы типа».В частности существует бесконечное количество типов : например, тип (integer m n).Небольшое количество этой бесконечности типов соответствует репрезентативным типам - фактической информации, которая сообщает системе, что это за вещь - но, очевидно, большинство из них этого не делают.Могут быть типы представлений, которые не имеют соответствующих типов.

Типы на практике служат трем целям, я думаю.

  • Информация о типах может рассказать системе о том, какие представительные типы использовать, которые могутпомогите ему проверить, что вещи имеют правильный тип представления, и оптимизировать вещи.
  • Информация о типе может позволить системе сделать выводы, которые могут существенно помочь.
  • Информация о типе может позволить программистам говорить о том, какого родавещи, с которыми они имеют дело, даже когда эта информация не помогает системе.Система может рассматривать такие объявления как утверждения о типах, которые могут сделать программы более безопасными и более простыми в отладке.Это важная причина для типов: даже если система не проверяет их, человеку, читающему ваш код, полезно знать, что он ожидает, скажем, целое число в [0, 30], то есть (integer 0 30).Действительно, даже если система не выполняет автоматическую проверку объявлений, вы можете выполнить принудительную проверку, скажем, (check-type x '(integer 0 30) ...).

Второй случай интересен.Допустим, у меня есть кое-что, что, как я сказал, система имеет тип (double-float 0.0d0).Это вряд ли будет более полезным с точки зрения репрезентативного типа, чем double-float.Но если я возьму квадратный корень этой вещи, то знание этого типа может быть действительно очень полезным: система может знать, что результатом является double-float, а не (complex double-float), и эти типы крайне маловероятно представляютсятак же.Таким образом, система может использовать мое объявление типа, чтобы сделать выводы таким образом (и эти выводы могут каскадно проходить через программу).Обратите внимание, что классы не могут сделать это (по крайней мере, классы CL не могут), как и тип представления объекта: вам нужно больше информации, чем это.

Так что да,типы служат ряду очень полезных целей, которые не удовлетворяются классами.

0 голосов
/ 26 февраля 2019

Тип - это набор значений.

Спецификатор типа - это способ кратко представить тип.

Реализации могут выполнять все виды разметки и регистрации.чтобы помочь им разобраться в типах вещей, но это не присуще понятию типов.

Класс - это объект, описывающий множество других объектов.Поскольку иметь краткое имя для такого набора (типа) весьма полезно, Common Lisp регистрирует имя класса как спецификатор типа для соответствующего набора объектов.Вот и все отношение типов к классам.

0 голосов
/ 26 февраля 2019

Система типов определяет разные объекты, которые делают разные вещи.Система CLOS в большей степени используется для методов, которые более логично определяют типы поведения для некоторых программистов.Исходя из Java, система CLOS была более логичной и систематичной для меня, поэтому она играет роль для некоторых программистов.Мне нравится думать о системе CLOS как о классе в Java, таком как класс Integer, и о системе типов, аналогичной примитивам в Java.Система CLOS просто помогает вам расширять ваши объекты с помощью методов более систематическим образом, чем создание структуры imho.

0 голосов
/ 26 февраля 2019

Объект имеет только один класс за раз, тогда как он может удовлетворять нескольким типам.Система типов представляет собой решетку, где вы можете вычислить наименьшую верхнюю границу и наибольшую нижнюю границу двух типов (используя соответственно or, and), и которая допускает верхний тип (T) и нижний тип(тип NIL, который не совпадает с типом NULL).

Реализация Common Lisp должна быть в состоянии определить, принадлежит ли значение типу, и начинается ли он с атомарных спецификаторов типа, таких как character или integer, и увеличивается с помощью спецификаторов составных типов (которые могут быть определены пользователем).

Но независимо от того, делается ли это с помощью тегов или статического анализа, остается реализация;на практике CL таков, что есть случаи, когда вы не можете статически точно определить тип объекта (кроме T), просто потому, что объект может быть переопределен позднее: вы не можете предполагать, что его тип является фиксированным (скажем: aпоэтому встроенные или глобальные объявления могут помочь с выводом типа).

Но если у вас есть область действия, в которой тип может быть гарантированно инвариантным, компилятор может свободно использовать распакованные типы данных для храненияценности.Тогда у вас нет помеченных данных.Это имеет место для локального объявления типов для переменных, но также и для специализированных массивов: после того, как массив построен, его тип элемента не изменяется с течением времени, и в некоторых случаях знание того, что массив содержит только (integer 0 15) элементов, может использоваться дляупаковать данные более эффективно.

0 голосов
/ 26 февраля 2019
  1. CLOS был добавлен в CL довольно поздно в игре (и это была не единственная объектная система, разработанная для CL)

  2. Даже с CLOS типСистема может быть использована компилятором для оптимизации и пользователем для рассуждения об их коде.

...