syntax - Common Lisp에서 eq, eql, equal 및 equalp의 차이점은 무엇입니까?




common-lisp equality (2)

더 많은 메모 :

  • 대부분의 CL 함수는 테스트가 지정되지 않은 경우 암시 적으로 EQL을 사용합니다.

  • STRING-EQUAL, = 및 TREE-EQUAL도 참조하십시오.

  • EQ의 핵심은 대개 포인터 비교입니다

그리고 대략적인 가이드 :

To compare against...      Use...

Objects/Structs            EQ

NIL                        EQ (but the function NULL is more concise and probably cheaper)

T                          EQ (or just the value but then you don't care for the type)

Precise numbers            EQL

Floats                     =

Characters                 EQL or CHAR-EQUAL

Lists, Conses, Sequences   EQ (if you want the exact same object)
                           EQUAL (if you just care about elements)

Strings                    EQUAL (case-sensitive), EQUALP (case-insensitive)
                           STRING-EQUAL (if you throw symbols into the mix)

Trees (lists of lists)     TREE-EQUAL (with appropriate :TEST argument)

효율면에서 대개 EQ >> EQL >> EQUAL >> EQUALP.

Common Lisp에서 eq , eql , equalequalp 의 차이점은 무엇입니까? 그 중 일부는 유형을 확인하고 일부는 유형 전체를 검사하지만 어느 것이 맞습니까? 다른 사람보다 사용하는 것이 더 좋은 경우는 언제입니까?


here 와 선생님의 슬라이드

eq 테스트 (컴퓨터 메모리의 동일한 덩어리로 표시)가 동일한 기호인지 여부를 확인합니다.

예 :

(eq 'A'B) NIL
(eq 'RAM'RAM) T
(eq (cons 'a'b) (cons a'b')); 왜냐하면 서로 다른 메모리 덩어리가 분명히 할당 될 수 있기 때문입니다.

eql 은 인수가 EQ를 만족하는지 먼저 테스트하고 그렇지 않으면 동일한 유형 및 값의 숫자인지 확인하려고 시도합니다.

예 :

(eql 4 4.0) NIL
(eql4 4) T

차이점을 확인하십시오 .

(4.0 4.0) NIL; 첫 번째 (수락 된) 답변에 설명 된대로 플랫폼에 따라 다름
(eql 4.0 4.0) T; 인수의 유형과 값이 동일 함

몇개의 구현에서는 (eq 4.0 4.0), 표준으로 지정되어 있지 않기 때문에, 구현은 심볼과 같이, 메모리에 숫자와 문자의 복사본을 1 개만 보관할 필요가 있을지 어떨지를 판정합니다. 엄지 손가락의 규칙에는, 당신이하고있는 일을 정말로 알지 못한다면 , 숫자와 문자에 관한 eq .

equal 은 "saner"비교 함수입니다. 일반적으로 두 개의 객체가 동일하게 보이는지 (구조적으로 유사하거나 동형인지)를 말하는 것으로 생각할 수 있습니다. 아마 당신이 일반적인 평등을 위해 사용하고자하는 연산자 일 것입니다. 그것은 숫자, 문자 및 기호에 대해 eql처럼 작동하지만 목록 (cons) 및 문자열의 경우 요소

예 :

(4 4와 같음) T
(등가 (+2 2) 4) T

이제 차이점을 주목하십시오.

(eql (cons 'a'b) (cons 'a'b)) NIL
(균등 (cons 'a'b) (cons'a'b)) T; equal은 보통 같은 것을 인쇄하는 것들에 해당한다.

equalp 는 평등하고 더 진보 된 것입니다. 숫자의 비교는 유형을 구분하지 않습니다. 문자와 문자열의 비교는 대소 문자를 구별합니다.

예 :

(equalp (cons 'a'b) (cons 'a'b)) T; 평등과 동일

이제 차이점을 주목하십시오.

평등 (4 4.0) NIL
등가 (4 4.0) T; equalp는 숫자 형식을 무감각하게 취급하므로





equality