2012-07-19 92 views
11

我想要一個在運行時獲取值類型的函數。例如使用:如何獲得Scheme中的值類型?

(get-type a) 

其中a一直define d是一些任意方案的值。

我如何做到這一點?或者我必須自己實現這個,使用一個boolean?number?等cond棧?

回答

11

在具有Tiny-CLOS類對象系統的Scheme實現中,您可以使用class-of。下面是在拍一個示例會話,使用詐騙:

$ 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:

[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> 
4

要檢查什麼類型只需添加一個問號的類型後,例如要檢查,如果x是一個數字:

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

只是繼續與。

+6

該OP特別詢問是否有替代方法。另外,爲什麼在使用'cond'時使用嵌套'if'? \ * boggles \ * – 2012-07-19 18:24:57

+0

@ewein @Chris Jester-Young這是缺少的嗎?對於'(get-Type(car(string-> list(number-> string 5))))'這不會返回任何東西。 – ArtB 2012-12-28 21:31:37

+1

原來我的情況是缺失的是'character?'。爲了完整起見,還有'vector?'。 – ArtB 2012-12-28 21:56:49

9

球拍,你可以通過道格·威廉姆斯從地球使用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) 
+0

這個軟件包確實很有幫助。我希望它是核心球拍的一部分。 – Salil 2013-06-01 02:39:55

3

這裏的所有答案都有幫助,但我認爲人們忽視瞭解釋爲什麼這可能很難; Scheme標準不包含靜態類型系統,所以值不能說只有一個「類型」。事物在子類型(例如數字和浮點數)和聯合類型(對於返回一個數字或字符串的函數是什麼類型?

如果您更多地描述您的使用需求,您可能會發現更多具體的答案可以幫助您更多。

+5

他說「在運行時」,所以這與靜態類型無關。這是他在 – newacct 2012-07-20 06:23:50

+0

之後的動態(運行時)類型的值。您錯過了John的觀點,因爲動態運行時類型並不總是有足夠的信息來消除歧義。具體的例子:假設我有一個處理顏色和名稱的程序。我可以選擇只用字符串表示這些類型的值。然後,如果我看到「灰色」一詞,則我沒有足夠的信息來區分該類型,因爲我使用的是相同的表示形式。 – dyoo 2012-07-20 15:18:11

+0

同上;你可以從我的帖子中刪除「靜態」這個詞,它仍然是有道理的。丹尼的例子是一個很好的例子。事實上,C語言有相同的問題:沒有「這個值的類型是什麼」操作符,因爲許多值具有相同的表示形式。 – 2012-07-23 13:00:24