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

Dynamic 如何在Scheme中获取值的类型?,dynamic,types,scheme,Dynamic,Types,Scheme,我想要一个在运行时获取值类型的函数。示例用法: (get-type a) 其中a已被定义为将d定义为某个任意方案值 我该怎么做?或者我必须自己实现这一点,使用第二个堆栈boolean?,number?等?要检查某物的类型,只需在类型后添加一个问号,例如检查x是否是一个数字: (define get-Type (lambda (x) (cond ((number? x) "Number") ((pair? x) "Pair") ((string

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

(get-type a)
其中
a
已被定义为
d定义为某个任意方案值


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

要检查某物的类型,只需在类型后添加一个问号,例如检查x是否是一个数字:

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

继续吧。

在类似CLOS的小型对象系统的Scheme实现中,您只需使用
。下面是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>
$racket-我诈骗
欢迎使用Racket v5.2.1。
->(42人)
#
->(t类)
#
->(福类)
#
->(酒吧类别)
#
同样地,Guile使用GOOPS:

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>
scheme@(guile user)>,使用(oop-goops)
方案@(欺诈用户)>(42类)
$1 = #
方案@(欺诈用户)>(t类)
$2 = #
方案@(欺诈用户)>(foo类)
$3 = #
方案@(欺诈用户)>(“bar”类)
$4 = #

在Racket中,您可以使用来自PLaneT的Doug Williams的软件包。它的工作原理如下:

> (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)

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


如果你再多描述一下你想要的用途,你可能会发现有更具体的答案对你更有帮助。

OP特别询问是否有替代方法。另外,如果可以使用
cond
,为什么还要使用嵌套的
if
s呢*boggles*@ewein@Chris Jester Young有遗漏吗?对于
(获取类型(car(string->list(number->string 5)))
这不会返回任何内容。对于我的情况,缺少的位是
字符?
。为了完整性起见,还有
vector?
。他说“在运行时”,所以这与静态类型无关。这是动态(运行时)类型的值,他在你错过John的观点后所做的,在这个意义上,动态运行时类型并不总是有足够的信息来消除歧义。具体示例:假设我有一个处理颜色和名称的程序。我可以选择仅用字符串来表示这些类型的值。如果我看到“灰色”这个词,我没有足够的信息来区分类型,因为我使用的是相同的表示;你可以从我的帖子中删除“静态”这个词,它仍然有意义。丹尼的例子很好。事实上,C语言也有同样的问题:没有“这个值的类型是什么”操作符,因为许多值具有相同的表示形式。我不明白为什么您给出的两个示例会带来任何问题。对于数字与浮点数的情况,返回后者,因为它是最小的。对于过程的情况,只需返回
'过程
。狭义地说:“大于零的数字”和“浮点数”类型如何?这两个都不适合另一个。更一般地说:您头脑中有一个特定的类型概念,您当然可以编写一个get类型来实现您想要的功能。你应该这么做!这个方案确实有帮助。我希望这是核心球拍的一部分。