나는 Graham Common Lisp Chapter 5 실습 5를했는데, 이것은 객체 X와 벡터 V를 취하는 함수를 필요로하며, V에서 X 바로 앞의 모든 객체의 목록을 반환한다.lisp 함수 구체화
(defun preceders (obj vec &optional (result nil) &key (startt 0))
(let ((l (length vec)))
(cond ((null (position obj vec :start startt :end l)) result)
((= (position obj vec :start startt :end l) 0)
(preceders obj vec result
:startt (1+ (position obj vec :start startt :end l))))
((> (position obj vec :start startt :end l) 0)
(cons (elt vec (1- (position obj vec :start startt :end l)))
(preceders obj vec result
:startt (1+ (position obj vec
:start startt
:end l))))))))
제대로 작동하지만 선생님은 나에게 다음과 같은 비판을 제공합니다 : 나는 재귀 버전을 수행 한
> (preceders #\a "abracadabra")
(#\C#\d #r)
: 같은
그것은 작동
"길이가 반복적으로 호출됩니다. 벡터로 그렇게 나쁘지는 않지만 여전히 불필요합니다. 보다 효율적이고 융통성있는 (사용자를위한) 코드는 다른 시퀀스 처리 기능과 마찬가지로이를 정의하는 것입니다. 다음을 사용하십시오 : start 및 : end 키워드 매개 변수, 다른 시퀀스 함수가하는 방식, 동일한 기본 초기 값. 길이는 많아야 한 번만 호출해야합니다. "
나는 Common Lisp 교과서와 Google과 상담하고 있지만이 비트에는 약간의 도움이있는 것처럼 보입니다."사용 방법 : 시작 : 시작 and : end keyword parameters "라고 말하면서"길이를 한 번만 호출하는 "방법에 대한 단서가 없습니다. 선생님이 게시 한 요구 사항을 충족시키기 위해 코드를 수정하는 방법에 대해 의견을 개진 할 수 있다면 고맙겠습니다. 감사합니다. 많은
는 UPDATE :!
(defun preceders (obj vec
&optional (result nil)
&key (start 0) (end (length vec)) (test #'eql))
(let ((pos (position obj vec :start start :end end :test test)))
(cond ((null pos) result)
((zerop pos) (preceders obj vec result
:start (1+ pos) :end end :test test))
(t (preceders obj vec (cons (elt vec (1- pos)) result)
:start (1+ pos) :end end :test test)))))
:
안녕 얘들 아, 이제 나는 다음과 같은 코드로 올라와있다
나는이 비판을받을 :
"하나 개 이상의 지점에서 동일하게 반복되는 복잡한 재귀 호출을 할 때, 사용 후, 호출 첫을 지역 변수에 저장하고, 자주 간단합니다 훨씬 간단 IF 또는 COND에서 변수 "
또한이 함수 내 반복 버전 :.
(defun preceders (obj vec)
(do ((i 0 (1+ i))
(r nil (if (and (eql (aref vec i) obj)
(> i 0))
(cons (aref vec (1- i)) r)
r)))
((eql i (length vec)) (reverse r))))
나는 비판을받을
"더 나은 시점에서 DO 시작 및 반복 된 0 테스트 제거"
아이디어를 나에게 알려주세요. 성공을 향한 나의 마지막 단계라고 생각합니다. 많은 감사!
Rainer 덕분에 구문에 도움이되는 비트가 너무 많아서 시퀀스 처리 기능에 대한 정확한 정의를 웹에서 찾기가 너무 어려워서 큰 감사를드립니다. 이제는 코드를 훨씬 간단하게 만들려고 노력하고 있습니다. 내 선생님이 나를 비판하게 될 것을 너희들이 알게하라. – Kevin