수색…


일반 목록

일반 목록은 Common Lisp에서 가장 단순한 유형의 목록입니다. 그것들은 순서가 정해진 요소의 요소입니다. 이들은 목록의 첫 번째 요소를 가져 오는 것과 같은 일정한 시간에 목록의 나머지 부분을 가져 오는 것과 같은 기본 작업을 지원하고 선형 시간에 임의 액세스를 지원합니다.

(list 1 2 3)
;=> (1 2 3)

(first (list 1 2 3))
;=> 1

(rest (list 1 2 3))
;=> (2 3)

"일반"목록에서 작동하는 많은 함수가 있으며 목록의 요소 만 신경 쓰면됩니다. 여기에는 find , mapcar 및 기타 많은 것들이 포함됩니다. (이들 기능 중 상당수는 이러한 기능 중 일부에 대해 17.1 Sequence Concepts 에서도 작동합니다.

연결 목록

일반 목록은 일련의 요소를 나타내는 데 유용하지만 때로는 값 매핑에 대한 일종의 키를 나타내는 것이 더 도움이됩니다. Common Lisp는 진정한 해시 테이블 ( 18.1 해시 테이블 개념 참조)을 포함 해 여러 가지 방법을 제공합니다. Common Lisp에서 Key to Value 매핑을 나타내는 두 가지 기본 방법 또는 속성 목록연관 목록이 있습니다. 이 예제는 연관 목록을 설명합니다.

연관리스트 또는 alist 는 각 쌍의 자동차 가 키이고 각 쌍의 cdr 이 연관된 값인 점선 쌍이 요소 인 "일반"목록입니다. 예를 들어,

(defparameter *ages* (list (cons 'john 34) (cons 'mary 23) (cons 'tim 72)))

은 개인 이름을 나타내는 기호를 나이를 나타내는 정수와 매핑하는 연관 목록으로 간주 할 수 있습니다. 멤버 와 같은 일반 목록 함수를 사용하여 일부 검색 함수를 구현할 수 있습니다. 예를 들어 의 나이를 검색하려면

(cdr (first (member 'mary *age* :key 'car)))
;=> 23

멤버 함수는 carmary 즉, ((mary. 23) (tim. 72)) cons 셀로 시작하는리스트의 꼬리를 반환하고, 먼저 리스트의 첫 번째 원소를 반환한다 . 23) 이고, cdr 은 그 쌍인 23 의 오른쪽을 반환합니다. 이것이 연관 목록의 값에 액세스하는 한 가지 방법이지만 연관 목록과 같은 규칙의 목적은 기본 표현 (목록)에서 추상화하고 데이터 구조로 작업하기위한 상위 수준 기능을 제공하는 것입니다.

연관 목록의 경우 검색 함수는 키, 연관 목록 및 선택적 테스트 키워드 (key, test, test-not)를 취하고 해당 키의 쌍을 반환하는 assoc입니다 .

(assoc 'tim *ages*)
;=> (tim . 72)

아이템이 존재하면 결과는 항상 cons 셀이 될 것이므로 assocnil을 리턴하면 아이템은리스트에 없다 :

(assoc 'bob *ages*)
;=> nil

연관 목록의 값을 업데이트하기 위해 setfcdr 과 함께 사용할 수 있습니다. 예를 들어, 의 생일이 도착하고 나이가 증가하면 다음 중 하나를 수행 할 수 있습니다.

(setf (cdr (assoc 'john *ages*) 35)

(incf (cdr (assoc 'john *ages*)))

incfsetf를 기반으로하기 때문에이 경우에 작동합니다.

연관 목록은 양방향 맵의 유형으로 사용될 수도 있습니다. 역방향 조합 함수 인 rassoc 을 사용하여 키 - 값 매핑이 값을 기반으로 검색 되기 때문 입니다.

이 예제에서 association list는 listcons를 명시 적으로 사용하여 만들었지 만 pairlis 를 사용하여 연관 목록을 만들 수도 있습니다. pairlis 는 키와 데이터의 목록을 받아이를 기반으로 연결 목록을 만듭니다.

(pairlis '(john mary tim) '(23 67 82))
;=> ((john . 23) (mary . 67) (tim . 82))

acons를 사용하여 단일 키 및 값 쌍을 연관 목록에 추가 할 수 있습니다.

(acons 'john 23 '((mary . 67) (tim . 82)))
;=> ((john . 23) (mary . 67) (tim . 82))

assoc 함수는 목록을 왼쪽에서 오른쪽으로 검색합니다. 즉, 연관 목록에서 값을 "마스크"할 수 있습니다. 즉, 목록에서 요소를 제거하거나 목록의 구조를 업데이트하지 않고도 새 요소를 목록의 시작. acons 함수는 다음과 같이 제공됩니다.

(defvar *ages* (pairlis '(john mary tim) '(34 23 72)))

(defvar *new-ages* (acons 'mary 29 *ages*))

*new-ages*
;=> ((mary . 29) (john . 34) (mary . 23) (tim . 72))

그리고 이제, mary에 대한 조회가 첫 번째 항목을 리턴합니다.

(assoc 'mary *new-ages*)
;=> 29

속성 목록

일반 목록은 일련의 요소를 나타내는 데 유용하지만 때로는 값 매핑에 대한 일종의 키를 나타내는 것이 더 도움이됩니다. Common Lisp는 진정한 해시 테이블 ( 18.1 해시 테이블 개념 참조)을 포함 해 여러 가지 방법을 제공합니다. Common Lisp에서 Key to Value 매핑을 나타내는 두 가지 기본 방법 또는 속성 목록연관 목록이 있습니다. 이 예제는 속성 목록을 설명합니다.

속성 목록 또는 plist 는 대체 값이 키와 관련 값으로 해석되는 "일반"목록입니다. 예를 들면 :

(defparameter *ages* (list 'john 34 'mary 23 'tim 72))

개인 이름을 나타내는 기호를 나이를 나타내는 정수와 매핑하는 속성 목록으로 간주 될 수 있습니다. 멤버 와 같은 일반 목록 함수를 사용하여 일부 검색 함수를 구현할 수 있습니다. 예를 들어 의 나이를 검색하려면

(second (member 'mary *age*))
;=> 23

멤버 함수는 23되면,메리부터리스트의 꼬리 (메리 23 팀 72), 반환하는리스트의 두 번째 요소를 반환한다. 이것이 속성 목록의 값에 액세스하는 한 가지 방법이지만 속성 목록과 같은 규칙의 목적은 기본 표현 (목록)에서 추상화하고 데이터 구조 작업을위한 상위 수준의 기능을 제공하는 것입니다.

속성 목록의 경우, 검색 기능입니다 getf 재산 목록, (더 일반적으로 지표라고 함) 키 및 키 값을 포함하지 않는 경우에 재산 목록을 반환 할 수있는 옵션 기본 값을 사용합니다.

(getf *ages* 'tim)
;=> 72

(getf *ages* 'bob -1)
;=> -1

특성 목록의 값을 갱신하기 위해 setf를 사용할 수 있습니다. 예를 들어, 의 생일이 도착하고 나이가 증가하면 다음 중 하나를 수행 할 수 있습니다.

(setf (getf *ages* 'john) 35)

(incf (getf *ages* 'john))

incfsetf를 기반으로하기 때문에이 경우에 작동합니다.

속성 목록에서 여러 속성을 한 번 조회하려면 get-properties를 사용하십시오 .

getf 함수는 목록을 왼쪽에서 오른쪽으로 검색합니다. 즉, 목록에서 값을 제거하거나 목록의 구조를 업데이트하지 않고 속성 목록의 값을 "마스크"할 수 있습니다. 예를 들어, list * :

(defvar *ages* '(john 34 mary 23 tim 72))

(defvar *new-ages* (list* 'mary 29 *ages*))

*new-ages*
;=> (mary 29 john 34 mary 23 tim 72)

그리고 이제, mary에 대한 조회가 첫 번째 항목을 리턴합니다.

(getf *new-ages* 'mary)
;=> 29


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow