2013-03-29 3 views
3

Я хочу вставить символ в список. Однако я хочу объединить этот символ с последним символом в списке. При добавлении и недостатках результат всегда состоит из двух разных символов. Ну, я хочу, чтобы мой объединенный символ стал моим результатом.Слияние символов в общем lisp

Пример:

 (XXXX 'a '5) ====> (a5)  

То, что я хотел бы иметь, вместо:

 (XXXX 'a '5) ====> (a 5) 

ответ

2

Ответ на этот вопрос вы спрашиваете это

(defun concatenate-objects-to-symbol (&rest objects) 
    (intern (apply #'concatenate 'string (mapcar #'princ-to-string objects)))) 
(concatenate-objects 'a 'b) ==> ab 

О, если вы хотите a В результате:

(defun xxxx (s1 s2) (list (concatenate-objects-to-symbol s1 s2))) 

Однако, я уверен, что это не вопрос, который вы на самом деле хотите спросить.

Создание новых символов программно это не то, что новички должны делать ...

+0

Как как только вы вводите токен в свой прослушиватель Lisp, который интерпретируется как имя символа, вы создали символ. – Kaz

+0

Нет, честно! Вы скопировали мой ответ !! (define xxxx (s1 s2) ...) GoZoner

2

Определить это:

(defun symbol-append (&rest symbols) 
    (intern (apply #'concatenate 'string 
       (mapcar #'symbol-name symbols)))) 

, а затем использовать его как:

* (symbol-append 'a 'b 'c) 
ABC 

* (apply #'symbol-append '(a b c)) 
ABC 

Если вы ожидать, что ваши аргументы для хранения материала помимо символов, затем заменить symbol-name на:

(lambda (x) 
    (typecase x ...)) 

или ранее существовавшая функция CL (которую я забыл :(), что нивелирует что-либо.

+0

Функция 'string' строит обозначения строк, но не, скажем, pathnames – sds

10

Вы не можете «объединить символы» в 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| 
+1

Ah yes' format' - язык программирования на языке программирования ... – GoZoner

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