2012-06-17 1 views
1

У меня есть эта ассоциация-лист в Common Lisp:Как преобразовать строку в символ для использования в качестве ключа в функции «ассоциировать» Lisp?

(defvar base-list (list (cons 'a 0) (cons 2 'c))) 

я должен позвонить assoc, когда мой аргумент типа string.

Для пары (A . 0) Мне нужно преобразовать символ «a» в символ, а для пары (2 . C) Мне нужно преобразовать «2» в символ. Как я могу это сделать?

Это должно работать так:

CL-USER 28 : 1 > (assoc (convert-string-to-symbol "a") base-list) 
(A . 0) 
CL-USER 28 : 1 > (assoc (convert-number-to-symbol "2") base-list) 
(2 . C) 

Я попытался с помощью intern но получил NIL:

CL-USER 29 : 1 > (assoc (intern "a") base-list) 
NIL 
+0

Хм..это похоже, но не работает! http://stackoverflow.com/questions/9812393/elisp-how-to-delete-an-element-from-an-association-list-with-string-key –

+0

выйдите из отладчика. –

+1

Часть NUMBER-TO-SYMBOL не имеет смысла, поскольку номер 2 не является символом. –

ответ

1

Вы были близки с intern; вы просто ошиблись. Попробуйте следующее:

> (assoc (intern "A") base-list) 
(A . 0) 

Обратите внимание, что здесь имя-строка заглавная.

В качестве альтернативы, вы можете использовать find-symbol искать существующего символа по имени:

> (assoc (find-symbol "A") base-list) 
(A . 0) 

Ключевым моментом здесь является то, что, когда вы написали свою оригинальную defvar форму, то читатель прочитать строку «а» и — в силу текущего readtable case — преобразовал имя символа в прописную. Символы с именами разных случаев не равны. Так получилось, что во время чтения читатель проецирует то, что вы написали (в нижнем регистре), на что-то другое (в верхнем регистре).

Вы можете проверить текущую политику случае преобразования для текущего читателя с помощью readtable-case функции:

> (readtable-case *readtable*) 
:UPCASE 

Чтобы узнать больше о том, как readtable случай и читатель Взаимодействовать смотрите обсуждение в section 23.1.2 of the Hyperspec.

1

функция, которую вы хотите, называется read-from-string:

CL-USER> (read-from-string "a") 
A 
1 
CL-USER> (read-from-string "2") 
2 
1 
CL-USER> 

Обратите внимание, что решения, основанные на нас intern или find-symbol не будет работать для строк, представляющих числа (например, «2») для большинства реализаций.

 Смежные вопросы

  • Нет связанных вопросов^_^