Существует ли функция Common Lisp для получения аргументов и возврата типов данных?

#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 и получить то, что я хочу, посмотреть, совместимы ли типы (то есть, тот же это тип или производный).