2016-02-23 44 views
1

我會試着在球拍比較+inf.0,例如:我們可以比較球拍中的+ inf.0嗎?

> (eq? +inf.0 +inf.0) 
#t 
> (+ +inf.0 2) 
+inf.0 

但是:

> (> (+ +inf.0 2) +inf.0) 
#f 
> (eq? (+ +inf.0 2) +inf.0) 
#f 
> (< (+ +inf.0 2) +inf.0) 
#f 

我想知道,也許我們可以用這種方式比較正無窮大多少?

+7

使用'=的'代替'EQ'比較數字,你會得到合理的結果(在一般情況下,避免'情商',除非你確信這是你想要的東西;?使用'平等'的最?事情和使用'='的數字)。當然,'(+ + inf.0 2)'只是'+ inf.0'。 –

+0

@AlexisKing,看起來像是對我的回答... –

回答

1

所以,這裏的問題是,你正在使用錯誤的類型的平等。球拍的平等檢查有點複雜,大部分只是其遺產遺留下來的遺留物。這裏有四種類型,當你應該使用它們:

  • =用這個號碼。如(= 5 5)

  • eq?將此用於指針相等。或多或少,當兩件事物指向內存中的相同位置時。除非您比較符號,或者如果您正在比較兩個變量以查看它們是否指向內存中的相同位置,則通常不想使用它。這與Java中的==類似。 (但不像==在Java中,不要用它來比較數字,使用=了點。)

  • eqv?不要使用此。我確信有人知道它的用途,但那個人不是我。它在那裏,因爲它曾經用於某種事物,但它不再是真的。

  • equal?將此用於深對象相等。它會查看結構的元素,看看它們是否相同(如果它們是透明的話)。實際上,equal?用於確定相等的結構can even declare a method。這與Java中的.equals()非常相似。如果兩件事是eq?,它們是equal?

因此,有了這些,有一些棘手的邊緣案件處理。通常涉及NaN+inf.0。正如你在這裏看到的,+inf.0本身不是eq?,但是它本身是=

(= +inf.0 +inf.0) ;; => #t 
(eq? +inf.0 +inf.0) ;; => #f 

此外,另外一個警告,不是所有的對象都可以深入比較。其中一個例子是關閉。在這些情況下,equal?將執行像eq?這樣的指針相等。

(equal? (lambda (x) 5) (lambda (x) 5)) ;; => #f 
(let ([a (lambda (x) 5)]) 
    (equal? a a)) ;; => #t 
+1

我認爲「大多數,但不是全部,數字平等的使用將覆蓋'eq?'」是危險的。除了符號平等之外,我會避免使用'eq?'來代替* everything *。即使如此,爲了保持一致性,我可能會使用「equal?」。等效功能湯是關於Racket在Scheme中根源的更多不必要的混淆之一,我認爲這是最不必要的。對所有事物都使用「平等」,它會一直做正確的事情......除了數字。用'='來表示。 (但我認爲這是一個不好的行爲 - 也許有一天它可以修復。) –

+0

我很樂意對這句話進行改寫。但是你說的一些不是真的,'eq?'也應該用於指針相等。如果你希望兩個變量只有在指向內存中的同一個結構時才相等,例如,如果你正在建立衛生模型,那麼這很重要。 –

+0

所以,我修改了答案。 @AlexisKing,你對那個更開心嗎? –

相關問題