2017-02-12 4 views
2

나는 목록을 포함하고있는 목록을 가지고 간략화 된 버전을 반환하는 것으로 가정되는 flatten이라는 함수를 작성 중이다. 내 기능을 실행하려고하면 점이있는 람다 목록은 매크로가 아니라 여기에 있습니다 : LIST "이 문제를 해결하는 방법에 대한 제안 사항은 무엇입니까?오류 : 점이있는 람다 목록은 매크로에만 허용되며 여기서는 사용할 수 없습니다 : LIST?

이것은 현재 가지고있는 내용입니다.

(defun flatten list 
    (cond 
     (null list)'() 
      (list (first list)) 
      (append (flatten (first list)) 
        (flatten (rest list))) 
     (cons (first list (flatten (rest list)))))) 
+0

심볼 이름으로'list'를 사용하지 마십시오; 그것은 이미 가치가 있으며, 이것은 그것을 숨길 것입니다. –

+4

@ScottHunter Common Lisp의 함수와 변수 (및 다른 것들)는 다른 네임 스페이스에 있으므로,'list'를 변수 이름으로 사용하는 것이 완벽합니다. – jkiiski

+5

[defun의 구문] (http://www.lispworks.com/documentation/HyperSpec/Body/m_defun.htm)에는 [일반 람다 목록] (http://www.lispworks.com/documentation/)이 관련되어 있습니다. HyperSpec/Body/03_da.htm) :'list' 심볼은 목록이 아니며 보통의 람다리스트는 아닙니다. 여기에도 다른 점도 있습니다. – tfb

답변

0

괄호가 올바르게 균형을 맞추지 못했습니다. (null list)'())은 닫는 cond을 닫습니다. 들여 쓰기는 사용자가 원하는 것이 아닙니다.

(defun flatten (list) 
    ...) 

COND

귀하의 cond 잘못 :

+0

나는 귀하의 제안을 받아 적절하게 개정했습니다. 내가 다시 시험 할 때 나는 여전히 같은 오류를 얻는다. 나는 아직도 무엇인가 놓치고 있냐? –

+0

분명히 말하지만 코드에서 표현하고자하는 것을 말하기가 어렵고 적절하게 표현하는 방법을 말하는 것이 어렵습니다. –

4

람다 목록

defun에 대한 인수 목록은이 Ordinary Lambda List (예, 귀하의 경우 (list))가 아닌 원자 list이 있어야한다 . 올바른 구문은

(cond (condition1 form11 form12 ...) 
     (condition2 form21 form22 ...) 
     ...) 

예컨대 :

(defun select-options() 
    (cond ((= a 1) (setq a 2)) 
     ((= a 2) (setq a 3)) 
     ((and (= a 3) (floor a 2))) 
     (t (floor a 3)))) => SELECT-OPTIONS 
(setq a 1) => 1 
(select-options) => 2 
a => 2 
(select-options) => 3 
a => 3 
(select-options) => 1 
(setq a 5) => 5 
(select-options) => 1, 2