2010-11-19 2 views
2

LISP는 저를 다시 한번 괴롭 힙니다 ... 목록에서 마지막 요소의 값을 가져올 수없는 이유는 무엇입니까? 나는 목록은 다음과 유사한 설정 한 :마지막 요소의 LISP 자동차?

이제
(setq bar '(((1 2) 3 4 5)((6 7) 8 9 10))) 

나는 4의 반환받을 :

(cdddar bar) 

:

(caddar bar) 

(5)에의 복귀가 하지만 5를 얻을 수는 없습니다.

(cadddar bar) 

왜 이런가요? d 5의 가치는 어떻게 얻습니까?

오류 :

; Warning: This function is undefined: 
; CADDDAR 

Error in KERNEL:%COERCE-TO-FUNCTION: the function CADDDAR is undefined. 
[Condition of type UNDEFINED-FUNCTION] 

답변

8

5 개 이상의 a와 d가있는 함수는 정의되어 있지 않습니다. 단 4 명 이하. 실용적 일 수 있기 때문에 그 길이만큼 기능이 너무 많습니다. 당신은이

그냥 그것을 밖으로 철자 : (car (cdr (cdr (cdr (cdr (car x))))))

+0

대답은 다음과 같습니다. (car (cdddar lst)) .... 이제 왜! = cadddar인지 모르겠다. – toast

+2

LISP 구현의 깊은 곳 : (defun cadr (x) ...) (defun cdar (x) ...) (defun caar (x) ...) (defun cddr x) ...) 등과 같이 길이가 1 ~ 4 인 'a'와 'd'의 모든 조합에 대해 적용됩니다. 스펙에는 길이가 5 인 항목이 너무 많아서 포함되지 않습니다. # cdadr 계열의 함수에는 특별한 것이 없습니다. 그것들은 유일하게 해석되지 않는다. 그들은 단지 정상적인 기능입니다. 당신은 틈새를 채우기위한 몇 가지 새로운 것들을 환영합니다 (defun ...). – jtdubs

2

음, 오류 메시지에 따라, 더 cadddar 기능이 없습니다. carcdr은 기본 목록 읽기 기능입니다. caddar과 같은 기타 요소는 하나 이상의 carcdr의 조합으로 작성되는 편의 기능입니다. 즉, caddar 등이 없으면 carcdr만으로 목록 조작을 수행 할 수 있으며 확장 된 기능을 사용하면 훨씬 쉽게 작업을 수행 할 수 있습니다.

이렇게 접근하는 방법은 carcdr을 사용하여 자신의 cadddar을 합성하는 것입니다. 이를 수행하는 방법을 즉시 알 수없는 경우 더 간단하게 시작하십시오 (예 : cadr 또는 cdar). cadddar까지 작성하십시오.

1
(first (last (first '(((1 2) 3 4 5) ((6 7) 8 9 10))))) 

-> 5 
1

기능을 4 개 이상의 a들과 d의이 표준에 의해 정의되지 않은으로, 아마도 때문에 거기에 그들 중 32입니다 [그것은 그때부터 기하 급수적으로 더 심해진다.]

리스트의 마지막 요소를 얻을 수있는 확실한 방법

: 마지막 단점 셀을 반환 last, 그래서

(car (last list)) 

당신에게 마지막 목록 요소를 제공합니다. 물론 list(first list)과 같은 형식 일 수 있습니다.