목록에서 작업 Lisp
-
09-06-2019 - |
문제
내가 찾고 있는 사방에서 다음과 같은 기능 Lisp,을 받고 있도:
을 찾아의 인덱스가 목록에.예제:
(index-of item InThisList)
바꾸기에 뭔가 특정 장소에서 목록.예제:
(replace item InThisList AtThisIndex) ;i think this can be done with 'setf'?
반환 항목에서 특정 index.예제:
(return InThisList ItemAtThisIndex)
이 시점까지,나는 그것으로 나 자신의 기능입니다.나는지 궁금하다면 나는 그냥 만드는 일이 더 나 자신을 위해.
이것은 어떻게 했을 날조 숫자 1:
(defun my-index (findMe mylist)
(let ((counter 0) (found 1))
(dolist (item mylist)
(cond
((eq item findMe) ;this works because 'eq' checks place in memory,
;and as long as 'findMe' was from the original list, this will work.
(setq found nil)
(found (incf counter))))
counter))
해결책
당신이 사용할 수 있는 setf
고 nth
대체하고 값을 검색하여 인덱스입니다.
(let ((myList '(1 2 3 4 5 6)))
(setf (nth 4 myList) 101); <----
myList)
(1 2 3 4 101 6)
을 찾으로 사용할 수 있는 인덱스 이 position
기능.
(let ((myList '(1 2 3 4 5 6)))
(setf (nth 4 myList) 101)
(list myList (position 101 myList)))
((1 2 3 4 101 6) 4)
내가 찾는 이러한 모든 에서 이러 인덱스의 기능.
다른 팁
- 을 찾아의 인덱스가 목록에.
에 Emacs Lisp and Common Lisp,당신은 당신 position
기능:
> (setq numbers (list 1 2 3 4))
(1 2 3 4)
> (position 3 numbers)
2
에서 방식,여기에는 꼬리 재귀 구현서 DrScheme's doc:
(define list-position
(lambda (o l)
(let loop ((i 0) (l l))
(if (null? l) #f
(if (eqv? (car l) o) i
(loop (+ i 1) (cdr l)))))))
----------------------------------------------------
> (define numbers (list 1 2 3 4))
> (list-position 3 numbers)
2
>
하지만 경우에 당신은 목록을 사용하여 컬렉션으로의 슬롯을 저장하는 구조화된 데이터,어쩌면 당신은 당신이 있어야에서 보 defstruct
거나 심지어는 몇 가지 종류의 Lisp 개체 시스템과 같은 박물관.
만약 당신이 학습이 특징이 있는지를 확인하고 보 실 Common Lisp 그리고/또는 작은 음모.
Cheers!
답변:
(위치는 항목의 순서 및 키에서 엔(0)종료 키트 테스트-지 않)
http://lispdoc.com/?q=position&search=Basic+search(setf(elt 시퀀스 지수)값)
(elt 시퀀스 지수)
http://lispdoc.com/?q=elt&search=Basic+search
참고:elt 는 것이 바람직하 nth 기 때문에 elt 지에서 작동 시퀀스,하지만 목록
제레미의 답 작업해야 합;그러나 그는 말했다,당신 자신을 찾을 쓰는 다음과 같은 코드
(setf(n 내가 내 목)새-elt)
당신은 아마 사용하여 잘못된 큰 데이터 구조를.목록은 단순히 링크된 목록,그래서 그들은'O(N)에 액세스하여 인덱스입니다.당신이 더 있을 수도 있습 배열을 사용하여.
또 어쩌면 당신은 당신을 사용하여 목록으로 튜플이 있습니다.는 경우에,그들은 잘해야합니다.하지만 당신은 아마 이름을 그래서 접근을 읽는 사람이 당신의 코드가 없는 것을 기억하"nth4"을 의미합니다.뭔가
(defun my-attr (list)
(nth 4 list))
(defun (setf my-attr) (new list)
(setf (nth 4 list) new))
+2 에 대한"실용적인 Common Lisp".그것은 혼합물의 공통적인 요리책과 품질은 자신을 가르쳐 Lisp 책입니다.
도 있"성공적인 Common Lisp"(http://www.psg.com/~dlamkins/sl/cover.html 고 http://www.psg.com/~dlamkins/sl/contents.html)는 듯를 채우기 위해 몇 가지 간격/확장에서 일을"실용적인 Common Lisp".
또한 저는 읽고 바울은 그레이엄의"ANSI cl"이에 대해 더 많은 언어의 기본지만,좀 더 설명이 있습니다.
가 동의 토마스.를 사용하면 목록 배열과 같은 다음의 것을 느리게(그리고 아마도 어색).그래서 당신이 사용하거나 배열이나 지팡이 기능을 썼지만 그들을 이동하는"up"도록하는 방식으로 쉽게 대체할 수 있습니다 느린 목록 배열을 사용한다.