Возврат элемента из списка - PullRequest
1 голос
/ 07 декабря 2009

Я пытаюсь выучить шепот, и, делая первые шаги, я застрял.Как я могу получить элемент c в следующем списке: (a b (c.d))

Я пробовал: (caar (last '(a b (c.d)))), но он возвращает CD, а не только C
Это, однако, работает, если между c, есть пробелы., d т.е.: (caar (last '(a b (c . d))))

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

Спасибо.

LE : Uisng GNU Clisp http://clisp.cons.org/ Возможно ли, что проблемавызвано реализацией?

Ответы [ 2 ]

4 голосов
/ 07 декабря 2009

Ваш код правильный, это опечатка (или, может быть, очень плохой шрифт?) В упражнении.

В Лиспе (Common Lisp и Scheme - это те два, которые я тестировал только сейчас, я не знаю, что такое Clojure), [почти] единственное разделение между символами - пробелы и скобки. Даже если . используется как буквальный синтаксис для cons, если вы наберете '(c.d), вы получите один символ в списке, а не два символа в объединенной ячейке.

Например,

'c.d     ; is one symbol
'(c . d) ; is two symbols in a single cons cell
'((c)d)  ; is two symbols, the first in a nested list

Редактировать: Так как вы используете Common Lisp, вот список соответствующих символов и алгоритм считывания . Таким образом, ( и ) являются завершающими символами , а . - нет. CLisp работает в соответствии со спецификацией Common Lisp.

2 голосов
/ 07 декабря 2009

Похоже, у вас есть опечатка в упражнении.

(c. D) - это cons-ячейка, обозначенная точечной парной нотацией.

Вот ссылка, которая имеет больше об этом http://c2.com/cgi/wiki?DottedPairNotation

...