Как получить тип значения в Схеме?

Мне нужна функция, которая получает тип значения во время выполнения. Пример использования:

(get-type a)

где a было define d для некоторого произвольного значения схемы.

Как мне это сделать? Или я должен сам реализовать это, используя стек стека boolean?, number? и т.д.?

Ответ 1

В реализациях Схемы с объектной системой типа Tiny-CLOS вы можете просто использовать class-of. Здесь пример сеанса в Racket с использованием Swindle:

$ racket -I swindle
Welcome to Racket v5.2.1.
-> (class-of 42)
#<primitive-class:exact-integer>
-> (class-of #t)
#<primitive-class:boolean>
-> (class-of 'foo)
#<primitive-class:symbol>
-> (class-of "bar")
#<primitive-class:immutable-string>

И аналогично с Guile с помощью GOOPS:

[email protected](guile-user)> ,use (oop goops)
[email protected](guile-user)> (class-of 42)
$1 = #<<class> <integer> 14d6a50>
[email protected](guile-user)> (class-of #t)
$2 = #<<class> <boolean> 14c0000>
[email protected](guile-user)> (class-of 'foo)
$3 = #<<class> <symbol> 14d3a50>
[email protected](guile-user)> (class-of "bar")
$4 = #<<class> <string> 14d3b40>

Ответ 2

В Racket вы можете использовать describe пакет от Doug Williams от PLaneT. Он работает следующим образом:

> (require (planet williams/describe/describe))
> (variant (λ (x) x))
'procedure
> (describe #\a)
#\a is the character whose code-point number is 97(#x61) and
general category is ’ll (letter, lowercase)

Ответ 3

Чтобы проверить тип чего-либо, просто добавьте вопросительный знак после типа, например, чтобы проверить, является ли x числом:

(define get-Type
  (lambda (x)
    (cond ((number? x) "Number")
          ((pair? x) "Pair")
          ((string? x) "String")
          ((list? x) "List")))) 

Просто продолжайте с этим.

Ответ 4

Все ответы здесь полезны, но я думаю, что люди пренебрегли объяснением, почему это может быть трудно; стандарт Схемы не включает систему статического типа, поэтому нельзя сказать, что значения имеют только один "тип". Вещи становятся интересными в подтипах и вокруг них (например, число против числа с плавающей запятой) и типах соединений (какой тип вы предоставляете функции, которая возвращает либо число, либо строку?).

Если вы охарактеризуете свое желаемое использование немного больше, вы можете обнаружить, что есть более конкретные ответы, которые помогут вам больше.