2012-10-21 3 views
2

리스트에 원자 목록을 반환하는 함수를 작성하려고합니다. 원자와리스트가 모두있는 목록을 가지고 있으며 함수를 실행할 때 목록을 반환해야합니다. 원자 내부 ..lisp 함수로 작업하기

예를 들어

의 :

(func '(2 34 5 (12) 7 (A B C) +)) 
-> (2 34 7 +) 

그리고이 결과 내부의 인수에 해당하는 경우 시도하려는 그런 것을 내가 실행하면

(ATOM ((func '(2 34 5 (12) 7 (A B C) +))) 
->T 

어떤 아이디어 나 방법에 어서 갈 수있다. 그거야? 도서 또는 참고 문헌

답변

3

표준 CL 기능을 사용하여,

[3]> (remove-if-not #'atom '(1 2 (12) +)) 
(1 2 +) 

[6]> (every #'atom (remove-if-not #'atom '(1 2 (12) +))) 
T 

당신이 그 (것)들에게 자신을 작성하려는 경우, 당신은 융합 할 수 #'atom을 입력하고 두 가지 특수 기능을 수행하십시오 (예 : remove-atomsevery-is-atom). 그러나 "원자"는 built-in function atom의 이름입니다. 첫 번째를 작성하는

한 가지 방법은

(defun remove-atoms (xs &aux (ys (list 1))) 
    (let ((p ys)) 
    (dolist (x xs (cdr ys)) 
     (if (atom x) (setf (cdr p) (list x) p (cdr p)))))) 

이 그것을 사용하기 때문에 여기 함수형 프로그래밍 의 정신을 위반하지 않는, 파괴 업데이 트를 사용하여 하향식 (top-down) 방식으로 결과 목록을 작성하다 구현 기법으로서 로컬에서. 이것은 Common-LISP – 다른 번역에서 일반 기능 tail-recursive-modulo-cons 코드의 특정 번역으로 볼 수 있습니다.

둘째 기능 :

(defun every-is-atom (xs) 
    (dolist (x xs T) 
    (if (not (atom x)) 
     (return-from every-is-atom NIL)))) 
2

그래서 인자로 전달 된 목록에있는 원자 값만 반환하는 함수를 원하십니까?

좋아요?

(defun func (lst) 
    (cond 
    ((null lst) '()) 
    ((atom (first lst)) 
    (cons (first lst) (func (rest lst)))) 
    (t (func (rest lst))))) 

여전히 일반적인 특별히 혀짤배기,하지만 내 생각에 좋은 읽기되지 않음 : SICP