문제

내가 찾고 있는 사방에서 다음과 같은 기능 Lisp,을 받고 있도:

  1. 을 찾아의 인덱스가 목록에.예제:

    (index-of item InThisList)
    
  2. 바꾸기에 뭔가 특정 장소에서 목록.예제:

    (replace item InThisList AtThisIndex) ;i think this can be done with 'setf'?
    
  3. 반환 항목에서 특정 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))
도움이 되었습니까?

해결책

당신이 사용할 수 있는 setfnth 대체하고 값을 검색하여 인덱스입니다.

(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)

내가 찾는 이러한 모든 에서 이러 인덱스의 기능.

다른 팁

  1. 을 찾아의 인덱스가 목록에.

에 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!

답변:

  1. (위치는 항목의 순서 및 키에서 엔(0)종료 키트 테스트-지 않)
    http://lispdoc.com/?q=position&search=Basic+search

  2. (setf(elt 시퀀스 지수)값)

  3. (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.htmlhttp://www.psg.com/~dlamkins/sl/contents.html)는 듯를 채우기 위해 몇 가지 간격/확장에서 일을"실용적인 Common Lisp".

또한 저는 읽고 바울은 그레이엄의"ANSI cl"이에 대해 더 많은 언어의 기본지만,좀 더 설명이 있습니다.

가 동의 토마스.를 사용하면 목록 배열과 같은 다음의 것을 느리게(그리고 아마도 어색).그래서 당신이 사용하거나 배열이나 지팡이 기능을 썼지만 그들을 이동하는"up"도록하는 방식으로 쉽게 대체할 수 있습니다 느린 목록 배열을 사용한다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top