Как получить тип значения в Scheme?
мне нужна функция, которая получает тип значения во время выполнения. Пример использования:
(get-type a)
здесь a
была define
d - некоторое произвольное значение схемы.
как мне это сделать? Или я должен реализовать это сам, используя стек cond boolean?
, number?
etc. ?
4 ответов
в схемных реализациях с крошечной Clos-подобной объектной системой вы можете просто использовать class-of
. Вот пример сеанса в Racket, используя Мошенничество:
$ 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>
и аналогично с хитростью, используя GOOPS:
scheme@(guile-user)> ,use (oop goops)
scheme@(guile-user)> (class-of 42)
= #<<class> <integer> 14d6a50>
scheme@(guile-user)> (class-of #t)
= #<<class> <boolean> 14c0000>
scheme@(guile-user)> (class-of 'foo)
= #<<class> <symbol> 14d3a50>
scheme@(guile-user)> (class-of "bar")
= #<<class> <string> 14d3b40>
в Racket, вы можете использовать describe
пакет Дага Уильямса с планеты. Он работает следующим образом:
> (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)
чтобы проверить тип чего-то, просто добавьте знак вопроса после типа, например, чтобы проверить, является ли x числом:
(define get-Type
(lambda (x)
(cond ((number? x) "Number")
((pair? x) "Pair")
((string? x) "String")
((list? x) "List"))))
просто продолжать.
все ответы здесь полезны, но я думаю, что люди забыли объяснить, почему это может быть трудно; стандарт схемы не включает в себя систему статического типа, поэтому значения не могут иметь только один "тип". Вещи становятся интересными в подтипах и вокруг них (например, число против числа с плавающей запятой) и типах объединения (какой тип вы даете функции, которая возвращает либо число, либо строку?).
Если вы опишете желаемое использование немного больше, вы можете обнаружить, что есть более конкретные ответы, которые помогут вам больше.