我想要一個在運行時獲取值類型的函數。例如使用:如何獲得Scheme中的值類型?
(get-type a)
其中a
一直define
d是一些任意方案的值。
我如何做到這一點?或者我必須自己實現這個,使用一個boolean?
,number?
等cond棧?
我想要一個在運行時獲取值類型的函數。例如使用:如何獲得Scheme中的值類型?
(get-type a)
其中a
一直define
d是一些任意方案的值。
我如何做到這一點?或者我必須自己實現這個,使用一個boolean?
,number?
等cond棧?
在具有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>
要檢查什麼類型只需添加一個問號的類型後,例如要檢查,如果x是一個數字:
(define get-Type
(lambda (x)
(cond ((number? x) "Number")
((pair? x) "Pair")
((string? x) "String")
((list? x) "List"))))
只是繼續與。
球拍,你可以通過道格·威廉姆斯從地球使用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)
這個軟件包確實很有幫助。我希望它是核心球拍的一部分。 – Salil 2013-06-01 02:39:55
這裏的所有答案都有幫助,但我認爲人們忽視瞭解釋爲什麼這可能很難; Scheme標準不包含靜態類型系統,所以值不能說只有一個「類型」。事物在子類型(例如數字和浮點數)和聯合類型(對於返回一個數字或字符串的函數是什麼類型?
如果您更多地描述您的使用需求,您可能會發現更多具體的答案可以幫助您更多。
他說「在運行時」,所以這與靜態類型無關。這是他在 – newacct 2012-07-20 06:23:50
之後的動態(運行時)類型的值。您錯過了John的觀點,因爲動態運行時類型並不總是有足夠的信息來消除歧義。具體的例子:假設我有一個處理顏色和名稱的程序。我可以選擇只用字符串表示這些類型的值。然後,如果我看到「灰色」一詞,則我沒有足夠的信息來區分該類型,因爲我使用的是相同的表示形式。 – dyoo 2012-07-20 15:18:11
同上;你可以從我的帖子中刪除「靜態」這個詞,它仍然是有道理的。丹尼的例子是一個很好的例子。事實上,C語言有相同的問題:沒有「這個值的類型是什麼」操作符,因爲許多值具有相同的表示形式。 – 2012-07-23 13:00:24
該OP特別詢問是否有替代方法。另外,爲什麼在使用'cond'時使用嵌套'if'? \ * boggles \ * – 2012-07-19 18:24:57
@ewein @Chris Jester-Young這是缺少的嗎?對於'(get-Type(car(string-> list(number-> string 5))))'這不會返回任何東西。 – ArtB 2012-12-28 21:31:37
原來我的情況是缺失的是'character?'。爲了完整起見,還有'vector?'。 – ArtB 2012-12-28 21:56:49