#common-lisp #introspection
#common-lisp #самоанализ
Вопрос:
Я пишу приложение на Common Lisp, которому в какой-то момент приходится иметь дело с типами данных. Короче говоря, у меня есть список с возможными функциями на выбор, и после того, как я случайным образом выбрал функцию, мне нужно найти другие для заполнения аргументов, чтобы возвращаемые типы этих функций соответствовали типам аргументов. Существует ли функция, которая возвращает некоторый список с ожидаемыми аргументами и возвращаемыми типами?
Я использую SBCL 1.4.16 в Ubuntu, если это поможет. В основном я ищу что-то вроде DESCRIBE, но это возвращает список или что-то подобное с типами.
Я пытался делать это вручную, но это означает, что каждый раз это утомительно, и я смотрю на более автоматизированный процесс, где я просто присваиваю ему символ функции и получаю обратно этот список. Я бы также предпочел не анализировать выходные данные DESCRIBE .
Например, берется функция foo, которая, будучи задана для ОПИСАНИЯ, имеет следующий вывод:
Derived type: (FUNCTION (NUMBER NUMBER) (VALUES NUMBER amp;OPTIONAL))
Я хотел бы получить вместо:
(NUMBER NUMBER (VALUES NUMBER amp;OPTIONAL))
в качестве возвращаемого значения.
Комментарии:
1. Это зависит от реализации, и не все функции будут иметь объявленные типы. Для SBCL вы могли бы попробовать
SB-INTROSPECT:FUNCTION-TYPE
, но она может возвращать или не возвращать что-либо полезное в зависимости от того, какие настройки оптимизации используются и был ли ftype объявлен вручную.2. Вы могли бы попробовать
(type-of #'foo)
, но я ожидаю, что большинство реализаций будут просто возвращатьFUNCTION
, не включая аргумент и возвращаемые типы.3. Вы также можете попробовать
FUNCTION-LAMBDA-EXPRESSION
, потому что объявления типов могут быть включены.4. @jkiiski Я получил то, что хотел, благодаря вашему предложению, спасибо! Теперь с этим действительно легко что-то сделать
CHECK-TYPE
и получить то, что я хочу, посмотреть, совместимы ли типы (то есть, тот же это тип или производный).