:
(defun fletten-level (tree)
(loop for e in tree
nconc
(if (consp e)
(copy-list e)
(list e))))
(fletten-level '(a (b (d (g f))) e))
;; (A B (D (G F)) E)
이 원래 나무 최상위 지점을 통해 루프 및 분기는을 인 경우 포함하는 새로운 목록을 만듭니다 잎, 그 잎, 그리고 가지에 다른 두 가지 가지가있는 경우에는 첫 번째 잎과 나머지 가지가 모두 있습니다.
편집 : 죄송합니다. 실제로 처음에는 좋지 않았습니다. 이제는 수정해야합니다.
EDIT2 : 나 혼란에 빠졌기 때문에. (cons (car e) (cdr e))
는 기본적으로 단지 e
을 말하는 것과 같기 때문에 약간 이상하게 보입니다. 그러나 nconc
은 conses를 파괴적으로 수정할 것이므로 (즉, 이전 cons 셀을 연결하는 대신 새로운 cons 셀을 생성하여)이를 수행해야합니다.
EDIT3 : 와우 ... 실제로는 원래 목록을 이렇게 수정합니다. copy-list
이어야합니다.
다른 답변의 버전도 비파괴 적입니다. 그것은'nconc'를 구현 도구로 사용하지만'list' 또는'copy-list'로 새로 할당 된 구조체 만 변경합니다. 따라서, 추가 "consing"또는 재귀없이 하향식 방식으로 결과를 생성하므로 효율적입니다. 그것이 TRMC를 구현하는 시스템에 의해 ("꼬리 재귀 적 모듈러 cons") (http://en.wikipedia.org/wiki/Tail_call#Tail_recursion_modulo_cons)되는 코드가 plausibly * 컴파일 * 될 수 있습니다 (또는 자동으로 재 작성) 최적화. –
아, 맞아. 설명해 주셔서 감사합니다! – user1582220