두 목록을 연결하는 방법?


15

죄송하지만 elisp가 최선이 아닙니다. 이 방법으로 두 문자열 목록을 결합해야합니다.

("a" "b" "c") + ("d" "e" "f") -> ("a" "b" "c" "d" "e" "f")

음, 순서는 중요하지 않으므로이 코드를 작성했습니다.

(while lista
  (add-to-list 'listb (car lista)) 
  (setq lista (cdr lista)))

작동하지만 이미이 기능을 수행하고 있는지 궁금합니다.

실마리? 미리 감사드립니다.


4
Elisp 매뉴얼의 노드 빌딩 목록 을 참조하십시오 .
Drew

2
append여기에 정답이지만 다른 (파괴적인) 방법은입니다 (setcdr (last a) b).
Sean Allred

1
목록 작업? dash.el ! (-concat '(1) '(2 3) '(4)) ;; => '(1 2 3 4)
Ehvince

add-to-listLisp 코드에서 사용하지 마십시오 (docstring에서 이것을 표시합니다). 대신을 사용하십시오 push.
Radon Rosborough

답변:


25

당신은 또한 추가를 사용할 수 있습니다.

(append '("a" "b" "c") '("d" "e" "f"))

2
그리고,(nconc '("a" "b" "c") '("d" "e" "f"))
lawlist

1
네, 사실 append여기가 더 나아 보입니다.
JeanPierre

nconc는 작동하지만 변수에 목록을 저장하면 nconc에 의해 수정됩니다. 예를 들어 (let ((a '(1 2 3)) (b'(3 4 5))) (nconc ab) a) 변수를 수정합니다.
John Kitchin

1
TYPE이 일 때 FYI가 cl-concatenate사용 하므로 두 답변 모두 동일한 결과를 생성합니다. appendlist
Phils

예, 반드시 일을합니다. 도움을 주신 모든 분들께 감사드립니다.
Daniele

3

concatenate는 'cl.el'에서 'cl-concatenate'의 별명입니다.

(TYPE SEQUENCE ...를 연결하십시오.)

SEQUENCEs 인수를 TYPE 유형의 시퀀스로 연결하십시오.

예를 들어

(concatenate 'list '("a" "b" "c") '("d" "e" "f"))

그것이 정의되어 있기 때문에 먼저 cl해야 할 수도 있습니다 (require 'cl). 그렇지 않으면 cl-concatenate기본적으로로드 된 것처럼 사용할 수 있습니다 .

또한 @phils가 지적한 cl-concatenate것처럼 appendTYPE이 'list인 경우 호출 하면 cl-extra.el다음 과 같습니다.

(defun cl-concatenate (type &rest sequences)
  "Concatenate, into a sequence of type TYPE, the argument SEQUENCEs.
\n(fn TYPE SEQUENCE...)"
  (pcase type
    (`vector (apply #'vconcat sequences))
    (`string (apply #'concat sequences))
    (`list (apply #'append (append sequences '(nil))))
    (_ (error "Not a sequence type name: %S" type))))

따라서 목록 만 사용 append하는 경우 @ John Kitchin이 지적한 것처럼 직접 사용하는 것이 더 간단합니다 .

마지막으로 @lawlist는 nconc다음 과 같이 언급했습니다 .

nconc는 'C 소스 코드'에 내장 된 함수입니다.

(nconc & rest 목록)

목록을 변경하여 원하는 수의 목록을 연결하십시오. 마지막 인수 만 변경되지 않으며 목록 일 필요는 없습니다.

이게 무슨 뜻이야:

(nconc '("a" "b" "c") '("d" "e" "f"))
=> ("a" "b" "c" "d" "e" "f")

(setq l1 '("a" "b" "c")
      l2 '("d" "e" "f"))
(nconc l1 l2)
=> ("a" "b" "c" "d" "e" "f")
l1
=> ("a" "b" "c" "d" "e" "f")
l2
=> ("d" "e" "f")

고맙지 만 두 번째 및 세 번째 인수가 변수이고 명시 적 목록이 아닌 경우 오류를 반환하는 것처럼 보입니다.
Daniele

1
(setq l1 '("a" "b" "c") l2 '("d" "e" "f")) (concatenate 'list l1 l2)작동합니다.
JeanPierre 2016 년

@Daniele 변수 를 인용 하려고 시도한 것 같습니다. 즉, 목록 값으로 평가되지 않습니다. (즉, 당신이 varname아니라 원합니다 'varname).
Phils

완벽을 기하기 위해 Emacs> = 25 : seq-concatenate(after (require 'seq)) 에서 모든 유형의 시퀀스를 연결하는 비 CL 방법을 언급 할 수도 있습니다 cl-concatenate.
바질
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.