Почему конструкция case общего lisp всегда соответствует True (T)? - PullRequest
4 голосов
/ 18 марта 2012

Это с SBCL 1.0.55 на Debian squeeze.Я, наверное, упускаю что-то очевидное, но я новичок, поэтому, пожалуйста, потерпите меня.

CL-USER> (defparameter x 0)

CL-USER> (case x (t 111) )
111

Так что, похоже, здесь случай, когда переменная x соответствует символу правды t,Это случается со всем, что я пробовал;это x только пример.Я не понимаю, почему это произошло.Поскольку case использует eql для сопоставления, я попытался

CL-USER> (eql x t)
NIL

Так, eql не соответствует x и t.Что мне не хватает?Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 18 марта 2012

Описано в документации CASE .

иначе-условие :: = ({иначе | t} форма *)

Синтаксис говорит, что в противном случае это либо (otherwise form-1 ... form-n), либо (t form-1 ... form-n). Обратите внимание, что синтаксис говорит {otherwise | t}. Вертикальная черта - это ИЛИ в спецификации синтаксиса. Таким образом, маркер для другого предложения либо otherwise, либо t.

Это означает, что если ваше предложение case начинается с otherwise или t, то у нас есть otherwise-clause.

6 голосов
/ 18 марта 2012

В конструкции case в Common Lisp, t, используемый сам по себе, эквивалентен default в C; то есть оценивается, если выражение не соответствует ни одному из других случаев. Если вы хотите сопоставить действительный символ t, используйте (t).

...