Вы не можете «объединить символы» в Lisp.
Прежде всего, 5
не является символом, а числом. Если вам нужен символ с именем "5"
, вы должны ввести его как |5|
(например).
Если функция принимает символ A
и символ |5|
и производит символ A5
, он не объединяет символы. Он создал новый символ, имя которого является именем имен этих входных символов.
Правильно разработанные программы Lisp редко зависят от имени символа. Они зависят от символов, являющихся уникальными объектами.
Если вы используете символы для идентификации вещей, и как 5
, так и A
идентифицируют какую-либо сущность, лучшим ответом необязательно является создание нового символа, который по наименованию по меньшей мере представляет собой mashup этих двух символов , Например, лучший дизайн может заключаться в том, чтобы признать, что имена являются многогранными или сложными в некотором роде. Возможно, список (A 5)
может служить именем.
Общие функции Lisp могут иметь составные имена. Например, (setf foo)
- это имя функции. Агрегаты, подобные спискам, могут быть именами.
Если вы просто нуждаетесь в машине для создания уникальных символов во время выполнения, рассмотрите возможность использования функции gensym
. Вы можете передать свой собственный префикс к нему:
(gensym "FOO") -> #:FOO0042
Конечно, приставка может быть имя какого-либо существующего символа, вытащил через symbol-name
. Символ #:FOO0042
не уникален из-за 0042
, а потому, что это только что выделенный объект в адресном пространстве. #:
означает, что он не интернирован ни в одном пакете. Название символа: FOO0042
.
Если вы все еще действительно хотите, простой способ взять распечатанное представление кучи объектов ввода и превратить его в символ это:
(defun mashup-symbol (&rest objects)
(intern (format nil "~{~a~}" objects)))
Примеры:
(mashup-symbol 1 2 3) -> |123|
(mashup-symbol '(a b) 'c 3) -> |(A B)C3|
Как как только вы вводите токен в свой прослушиватель Lisp, который интерпретируется как имя символа, вы создали символ. – Kaz
Нет, честно! Вы скопировали мой ответ !! (define xxxx (s1 s2) ...) –
GoZoner