Каково различие между eq, eql, равный и equalp, в языке Common LISP?

Вы можете создать псевдоним:

[alias]
    ndiff = !git --no-pager diff --name-only

и затем запустить git ndiff вместо git diff --name-only. Или оставьте часть --no-pager вне псевдонима и запустите git ndiff --name-only, где ndiff означает no-pager-diff.

Или вместо git diff вы можете запустить git diff-tree или git diff-files или git diff-index. Эти три команды являются бэкэндами сантехнических команд , которые git diff использует (для большинства своих) различных режимов работы. Ни один из них не использует пейджер, и большинству из них требуются дополнительные опции (например, -r), которые будут использоваться таким же образом, как git diff их запускает, но они существуют и являются правильным способом написания скриптов [ 1115]. Для ваших собственных псевдонимов нет необходимости использовать сантехнические команды; Ваш собственный псевдоним может просто вызвать git --no-pager diff <options>.

69
задан nbro 8 September 2017 в 13:51
поделиться

2 ответа

От язык Common LISP: Предикаты Равенства

(eq x y) верны, если и только если x и y тот же одинаковый объект.

eql предикат верен, если его аргументы eq, или если они - числа того же типа с тем же значением, или если они - символьные объекты, которые представляют тот же символ.

equal предикат верен, если его аргументами являются структурно подобные (изоморфные) объекты. Грубое эмпирическое правило - то, что два объекта равны, если и только если их печатные представления являются тем же.

Два объекта equalp, если они равны; если они - символы и удовлетворяют символьно-равный, который игнорирует алфавитный регистр и определенные другие атрибуты символов; если они - числа и имеют то же численное значение, даже если они имеют различные типы; или если у них есть компоненты, которые являются всем equalp.

Вот некоторые примеры от той же страницы, которую я связал с вышеупомянутым:

(eq 'a 'b) is false. 
(eq 'a 'a) is true. 
(eq 3 3) might be true or false, depending on the implementation. 
(eq 3 3.0) is false. 
(eq 3.0 3.0) might be true or false, depending on the implementation. 
(eq #c(3 -4) #c(3 -4)) 
  might be true or false, depending on the implementation. 
(eq #c(3 -4.0) #c(3 -4)) is false. 
(eq (cons 'a 'b) (cons 'a 'c)) is false. 
(eq (cons 'a 'b) (cons 'a 'b)) is false. 
(eq '(a . b) '(a . b)) might be true or false. 
(progn (setq x (cons 'a 'b)) (eq x x)) is true. 
(progn (setq x '(a . b)) (eq x x)) is true. 
(eq #\A #\A) might be true or false, depending on the implementation. 
(eq "Foo" "Foo") might be true or false. 
(eq "Foo" (copy-seq "Foo")) is false. 
(eq "FOO" "foo") is false.


(eql 'a 'b) is false. 
(eql 'a 'a) is true. 
(eql 3 3) is true. 
(eql 3 3.0) is false. 
(eql 3.0 3.0) is true. 
(eql #c(3 -4) #c(3 -4)) is true. 
(eql #c(3 -4.0) #c(3 -4)) is false. 
(eql (cons 'a 'b) (cons 'a 'c)) is false. 
(eql (cons 'a 'b) (cons 'a 'b)) is false. 
(eql '(a . b) '(a . b)) might be true or false. 
(progn (setq x (cons 'a 'b)) (eql x x)) is true. 
(progn (setq x '(a . b)) (eql x x)) is true. 
(eql #\A #\A) is true. 
(eql "Foo" "Foo") might be true or false. 
(eql "Foo" (copy-seq "Foo")) is false. 
(eql "FOO" "foo") is false.


(equal 'a 'b) is false. 
(equal 'a 'a) is true. 
(equal 3 3) is true. 
(equal 3 3.0) is false. 
(equal 3.0 3.0) is true. 
(equal #c(3 -4) #c(3 -4)) is true. 
(equal #c(3 -4.0) #c(3 -4)) is false. 
(equal (cons 'a 'b) (cons 'a 'c)) is false. 
(equal (cons 'a 'b) (cons 'a 'b)) is true. 
(equal '(a . b) '(a . b)) is true. 
(progn (setq x (cons 'a 'b)) (equal x x)) is true. 
(progn (setq x '(a . b)) (equal x x)) is true. 
(equal #\A #\A) is true. 
(equal "Foo" "Foo") is true. 
(equal "Foo" (copy-seq "Foo")) is true. 
(equal "FOO" "foo") is false.


(equalp 'a 'b) is false. 
(equalp 'a 'a) is true. 
(equalp 3 3) is true. 
(equalp 3 3.0) is true. 
(equalp 3.0 3.0) is true. 
(equalp #c(3 -4) #c(3 -4)) is true. 
(equalp #c(3 -4.0) #c(3 -4)) is true. 
(equalp (cons 'a 'b) (cons 'a 'c)) is false. 
(equalp (cons 'a 'b) (cons 'a 'b)) is true. 
(equalp '(a . b) '(a . b)) is true. 
(progn (setq x (cons 'a 'b)) (equalp x x)) is true. 
(progn (setq x '(a . b)) (equalp x x)) is true. 
(equalp #\A #\A) is true. 
(equalp "Foo" "Foo") is true. 
(equalp "Foo" (copy-seq "Foo")) is true. 
(equalp "FOO" "foo") is true.
77
ответ дан nbro 24 November 2019 в 13:51
поделиться

Еще некоторые примечания:

  • Большинство функций CL неявно использует EQL, когда никакой тест не указан

  • , Видят также РАВНЫЙ СТРОКЕ, = и ДРЕВОВИДНО-РАВНЫЙ

  • В ядре 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>> РАВНЫЙ>> EQUALP.

29
ответ дан Leslie P. Polzer 24 November 2019 в 13:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: