Проверка, являются ли элементы списка строками в CL - PullRequest
2 голосов
/ 19 марта 2011

Я пытаюсь выучить Common Lisp (sbcl) и попрактиковаться с базовыми определениями.Сейчас я пытаюсь написать один, который добавляет длины всех строк в списке.

Первым шагом является проверка того, является ли первый элемент строкой.Я предположил, что вы могли бы назвать это с

(stringp (car '(s1 s2)))

, где s1 и s2 - строки.Тестирование s1 с помощью stringp и запрос машины из списка, кажется, работают нормально, но объединение их вместе не дает мне того, чего я ожидаю:

CL-USER> (car '(s1 s2))
S1
CL-USER> (stringp s1)
T
CL-USER> (stringp (car '(s1 s2)))
NIL

Я неправильно понимаю функцию stringp или способсписки работают?

Спасибо

Ответы [ 2 ]

5 голосов
/ 19 марта 2011

'(s1 s2) - список, содержащий символы s1 и s2. Таким образом, (car '(s1 s2)) возвращает символ s1 (как видно из того факта, что REPL печатает S1, а не какую-либо строку, сохраненную в переменной s1. Поскольку символ не является строкой, stringp возвращает ложь.

Если вы действительно используете список строк, он будет работать так, как вы ожидаете:

* (car (list s1 s2))
"contents of s1"

* (stringp (car (list s1 s2)))
T
2 голосов
/ 19 марта 2011

QUOTE предотвращает оценку вложенной формы. Вложенная форма возвращается как есть.

(car '(s1 s2)) возвращает S1. Который является символом, а не строкой.

Если вы оцениваете s1, тогда Lisp возвращает его значение. Но это использует другой шаг оценки.

Если вы посмотрите на s1 как на символ, тогда он останется символом, если вы скажете Лиспу:

CL-USER > 's1
S1

CL-USER > (stringp 's1)
NIL
...