Есть ли в Common Lisp функция, которая возвращает символ из заданной строки? - PullRequest
5 голосов
/ 18 февраля 2011

хочу

>(??? "car")
CAR
>((??? "car") '(1 2))
1 

Я не могу найти функцию, которая делает это.

Ответы [ 3 ]

9 голосов
/ 18 февраля 2011

Есть несколько, в зависимости от того, что именно вы хотите сделать.

Во-первых, intern , это вернет существующий символ с таким именем, если он существует и будетв противном случае создайте новый.

Во-вторых, find-symbol , это вернет символ, если он существует, и ноль в противном случае (у него есть два возвращаемых значения, второе можно использовать для различениямежду «возвратом nil как символа» и «возвратом nil как символа не найдено»).

В-третьих, существует make-symbol , это всегда будет создавать новый, непостоянный символ ипочти гарантированно не будет тем, что вы хотите в этом конкретном случае.

2 голосов
/ 20 февраля 2011
>(??? "car")
CAR
>((??? "car") '(1 2))
1 

use:

CL-USER 17 > (find-symbol "CAR")
CAR
:INHERITED

CL-USER 18 > (funcall (find-symbol "CAR") '(1 2))
1

Обратите внимание, что имена символов являются внутренними символами UPPERCASE в Common Lisp.FUNCALL позволяет нам вызывать символ как функцию.Можно также использовать функциональный объект с FUNCALL.

Вы также можете создать форму и EVAL, которые:

CL-USER 19 > (eval `(,(find-symbol "CAR") '(1 2)))
1

или

CL-USER 20 > (eval (list (find-symbol "CAR") ''(1 2)))
1
2 голосов
/ 18 февраля 2011

Вы ищете это?

(eval (read-from-string "(car '(1 2))"))

Дает: 1


UPDATE:

Как насчет (funcall (intern "CAR") '(1 2))? :)

...