如何在Scheme中获取值的类型?

时间:2012-07-19 18:14:48

标签: dynamic types scheme

我想要一个在运行时获取值类型的函数。使用示例:

(get-type a)

其中adefine d是某个任意的Scheme值。

我该怎么做?或者我必须自己实现这一点,使用boolean?number?等的cond堆栈?

4 个答案:

答案 0 :(得分:13)

在使用类似Tiny-CLOS的对象系统的Scheme实现中,您可以使用class-of。这是使用Swindle的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的Guile类似:

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

答案 1 :(得分:11)

在Racket中,您可以使用来自PLaneT的Doug Williams的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)

答案 2 :(得分:6)

这里的所有答案都有帮助,但我认为人们忽略了解释为什么这可能很难; Scheme标准不包括静态类型系统,因此不能说值只有一个“类型”。事物在子类型中变得有趣(例如数字与浮点数)和联合类型(你给一个返回数字或字符串的函数提供什么类型?)。

如果您更多地描述了您想要的用途,您可能会发现有更多具体的答案会对您有所帮助。

答案 3 :(得分:4)

要检查某些内容的类型,只需在类型后添加问号,例如检查x是否为数字:

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

继续。