2013-07-03 3 views
4

Почему это:равно Оператор в Common Lisp

(every (lambda (x) (equal "a" x)) "aaaaa") 

и это:

(every (lambda (x) (equal "a" x)) "a") 

возвращение NIL, в то время как это:

(every (lambda (x) (equal "a" x)) '("a" "a" "a" "a")) 

возвращается T? Я думал, что every работал над всеми последовательностями.

+1

'(, педант это функция не оператор) – d11wtq

+0

@ d11wtq вы можете объяснить? – fvrghl

+1

lisp не имеет «операторов», он имеет только функции. Когда вы выполняете '(equal x y)', вы применяете функцию 'equal' к' x' и 'y'. – d11wtq

ответ

15

Вы всегда можете найти его самостоятельно. Тест всего несколько секунд прочь, если вы используете интерактивную систему Lisp:

CL-USER 1 > (every (lambda (x) (equal "a" x)) "a") 
NIL 

Над возвращает NIL.

Теперь используйте функцию Common Lisp DESCRIBE, чтобы получить описанные данные.

CL-USER 2 > (every (lambda (x) 
        (describe x) 
        (describe "a") 
        (equal "a" x)) 
        "a") 

#\a is a CHARACTER 
Name    "Latin-Small-Letter-A" 
Code    97 
Bits    0 
Font    0 
Function-Key-P  NIL 

Таким образом, значение x является персонажем. Символ #\a.

"a" is a SIMPLE-BASE-STRING 
0  #\a 
NIL 

тип "а" SIMPLE-BASE-STRING (здесь в LispWorks).

Если вы посмотрите на определение EQUAL, вы увидите, что символ и строка никогда не равны, потому что они имеют разные типы.

CL-USER 3 > (equal #\a "a") 
NIL 
13

Потому что в случае 1 и случая 2 вы сравниваете "a" и #\a, но в последнем случае вы сравниваете "a" и "a". Элементы строк - это символы, а не другие строки.

Например:

(every (lambda (x) (equal #\a x)) "aaaaa") 
=> T 

Другой альтернативой является принуждать x в строку:

(every (lambda (x) (equal "a" (string x))) "aaaaa")