2013-03-29 1 views
3

목록에 char을 삽입하고 싶습니다. 그러나이 문자를 목록의 마지막 기호와 병합하고 싶습니다. 추가와 단점으로 결과는 항상 두 개의 다른 기호입니다. 음, 하나의 병합 된 심볼을 내 결과로 만들고 싶습니다. 당신이 원하는 경우,기호를 공통 lisp로 병합

 (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 

입니다 :

예 : 내가 좋아하는 것이 무엇

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

대신에,이하기 a 목록 결과 :

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

그러나, 나는 당신이 실제로 물어을 원하는이 하지 질문입니다 확신합니다.

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

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

당신이 당신의 인수를 기대하는 경우로 사용 후

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

과 :

프로그램 새 심볼 만들기

뭔가 초보자 일을해야되지 ...

+0

로 심볼 이름으로 해석되는 Lisp 리스너에 토큰을 입력하자마자 기호를 만들었습니다. – Kaz

+0

공정하지 않다! 내 대답을 복사 했어 !! (define xxxx (s1 s2) ...) GoZoner

2

이 정의 기호 외에 물건을 포함하려면 을 다음으로 대체하십시오.

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

또는 기존 CL 기능 (내가 잊어 버린 :()은 무엇이든 문자열로 나타냅니다.)

+0

함수'string'은 어떤 문자열 지정자를 string으로 표현하지만, 말하자면 경로명을 말하지 않는다. – sds

10

Lisp에서 "심볼을 병합"할 수 없습니다.

우선 5은 기호가 아니며 숫자입니다. "5"이라는 심볼을 원하면 |5|과 같이 입력해야합니다 (예 :).

기호가 A이고 기호가 |5| 인 경우 기호가 A5 인 경우 기호가 병합되지 않았습니다. 그것은 새로운 기호를 만들었습니다. 그 이름은 그 입력 기호들의 이름들의 연결입니다.

제대로 설계된 Lisp 프로그램은 심볼의 이름에 거의 의존하지 않습니다. 고유 한 엔티티 인 기호에 의존합니다.

기호를 사용하여 사물을 식별하고 5A이 일부 엔티티를 식별하는 경우 가장 좋은 대답은 반드시 적어도 두 기호의 매시업 인 새로운 기호를 만드는 것이 아닙니다. . 예를 들어, 더 좋은 디자인은 그 이름이 어떤 식 으로든 다각적이거나 복합적이라는 것을 받아 들일 수 있습니다. 아마도 목록 (A 5)을 이름으로 사용할 수 있습니다.

일반적인 Lisp 함수 자체는 복합체 이름을 가질 수 있습니다. 예를 들어 (setf foo)은 함수 이름입니다. 목록과 같은 집계는 이름이 될 수 있습니다.

기계가 런타임시 고유 한 기호를 생성하기 만하면 gensym 기능을 사용해보십시오. 당신은 그것을 자신의 접두사를 전달할 수 있습니다

(gensym "FOO") -> #:FOO0042 

은 물론, 접두사 일부 기존 심볼의 이름이 될 수 있습니다, symbol-name를 통해 꺼냈다. 기호 #:FOO00420042 때문에 고유하지 않지만 주소 공간에 새로 할당 된 개체이기 때문에 고유하지 않습니다. #:은 패키지에 포함되어 있지 않음을 의미합니다. 기호의 이름은 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

관련 문제