LISP-시퀀스
시퀀스는 LISP의 추상 데이터 유형입니다. 벡터와 목록은이 데이터 유형의 두 가지 구체적인 하위 유형입니다. 시퀀스 데이터 유형에 정의 된 모든 기능은 실제로 모든 벡터 및 목록 유형에 적용됩니다.
이 섹션에서는 시퀀스에서 가장 일반적으로 사용되는 함수에 대해 설명합니다.
시퀀스 (즉, 벡터 및 목록)를 조작하는 다양한 방법을 시작하기 전에 사용 가능한 모든 함수 목록을 살펴 보겠습니다.
시퀀스 생성
make-sequence 함수를 사용하면 모든 유형의 시퀀스를 만들 수 있습니다. 이 함수의 구문은 다음과 같습니다.
make-sequence sqtype sqsize &key :initial-element
sqtype 유형 과 sqsize 길이 의 시퀀스를 생성합니다 .
선택적으로 : initial-element 인수를 사용하여 일부 값을 지정할 수 있습니다 . 그러면 각 요소가이 값으로 초기화됩니다.
예를 들어, main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.
(write (make-sequence '(vector float)
10
:initial-element 1.0))
코드를 실행하면 다음 결과가 반환됩니다.
#(1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0)
시퀀스의 일반 함수
Sr. 아니. | 기능 및 설명 |
---|---|
1 | elt 정수 인덱스를 통해 개별 요소에 액세스 할 수 있습니다. |
2 | length 시퀀스의 길이를 반환합니다. |
삼 | subseq 특정 인덱스에서 시작하여 특정 종료 인덱스 또는 시퀀스의 끝까지 계속되는 하위 시퀀스를 추출하여 하위 시퀀스를 반환합니다. |
4 | copy-seq 인수와 동일한 요소를 포함하는 시퀀스를 반환합니다. |
5 | fill 시퀀스의 여러 요소를 단일 값으로 설정하는 데 사용됩니다. |
6 | replace 두 개의 시퀀스를 취하고 첫 번째 인수 시퀀스는 두 번째 인수 시퀀스에서 연속 요소를 복사하여 파괴적으로 수정됩니다. |
7 | count 항목과 시퀀스를 취하고 항목이 시퀀스에 나타나는 횟수를 반환합니다. |
8 | reverse 인수의 동일한 요소를 포함하지만 역순으로 시퀀스를 반환합니다. |
9 | nreverse 시퀀스와 동일한 요소를 포함하지만 역순으로 동일한 시퀀스를 반환합니다. |
10 | concatenate 여러 시퀀스의 연결을 포함하는 새 시퀀스를 생성합니다. |
11 | position 항목과 시퀀스를 취하고 시퀀스 또는 nil에서 항목의 인덱스를 반환합니다. |
12 | find 항목과 시퀀스가 필요합니다. 시퀀스에서 항목을 찾아 반환합니다. 찾을 수 없으면 nil을 반환합니다. |
13 | sort 시퀀스와 두 개의 인수 조건자를 취하고 정렬 된 시퀀스 버전을 반환합니다. |
14 | merge 두 시퀀스와 술어를 취하고 술어에 따라 두 시퀀스를 병합하여 생성 된 시퀀스를 리턴합니다. |
15 | map n- 인수 함수와 n 시퀀스를 취하고 시퀀스의 후속 요소에 함수를 적용한 결과를 포함하는 새 시퀀스를 반환합니다. |
16 | some 조건자를 인수로 취하고 인수 시퀀스를 반복하고 조건자가 반환 한 NIL이 아닌 첫 번째 값을 반환하거나 조건자가 충족되지 않으면 false를 반환합니다. |
17 | every 술어를 인수로 취하고 인수 시퀀스를 반복하며 술어가 실패하자마자 종료되고 false를 리턴합니다. 술어가 항상 충족되면 true를 리턴합니다. |
18 | notany 술어를 인수로 취하고 인수 시퀀스를 반복하며 술어가 충족되는 즉시 false를 리턴하고 그렇지 않으면 true를 리턴합니다. |
19 | notevery 술어를 인수로 취하고 인수 시퀀스를 반복하고 술어가 실패하면 즉시 true를 리턴하고 술어가 항상 충족되면 false를 리턴합니다. |
20 | reduce 단일 시퀀스에 대해 매핑하여 시퀀스의 처음 두 요소에 먼저 두 인수 함수를 적용한 다음 함수 및 시퀀스의 후속 요소가 반환 한 값에 적용합니다. |
21 | search 시퀀스를 검색하여 일부 테스트를 충족하는 하나 이상의 요소를 찾습니다. |
22 | remove 항목과 시퀀스를 취하고 항목 인스턴스가 제거 된 시퀀스를 반환합니다. |
23 | delete 이것은 또한 항목과 시퀀스를 취하고 항목을 제외하고 동일한 요소를 갖는 인수 시퀀스와 동일한 종류의 시퀀스를 반환합니다. |
24 | substitute 새 항목, 기존 항목 및 시퀀스를 가져 와서 기존 항목의 인스턴스가 새 항목으로 대체 된 시퀀스를 반환합니다. |
25 | nsubstitute 새 항목, 기존 항목 및 시퀀스를 취하고 기존 항목의 인스턴스가 새 항목으로 대체 된 동일한 시퀀스를 반환합니다. |
26 | mismatch 두 개의 시퀀스를 사용하고 일치하지 않는 첫 번째 요소 쌍의 인덱스를 반환합니다. |
표준 시퀀스 함수 키워드 인수
논의 | 의미 | 기본값 |
---|---|---|
:테스트 | 항목 (또는 : key 함수로 추출한 값)을 요소와 비교하는 데 사용되는 2 인수 함수입니다. | EQL |
:키 | 실제 시퀀스 요소에서 키 값을 추출하는 단일 인수 함수입니다. NIL은 요소를 그대로 사용함을 의미합니다. | 무 |
:스타트 | 하위 시퀀스의 시작 인덱스 (포함)입니다. | 0 |
:종료 | 하위 시퀀스의 끝 인덱스 (배타적)입니다. NIL은 시퀀스의 끝을 나타냅니다. | 무 |
: 끝부터 | 참이면 시퀀스가 끝에서 시작까지 역순으로 순회됩니다. | 무 |
:카운트 | 제거하거나 대체 할 요소의 수를 나타내는 숫자 또는 모두를 나타내는 NIL (REMOVE 및 SUBSTITUTE 만 해당). | 무 |
시퀀스에서 작동하는 이러한 함수에서 인수로 사용되는 다양한 함수와 키워드에 대해 방금 논의했습니다. 다음 섹션에서는 예제를 사용하여 이러한 함수를 사용하는 방법을 살펴 보겠습니다.
길이와 요소 찾기
그만큼 length 함수는 시퀀스의 길이를 반환하고 elt 함수를 사용하면 정수 인덱스를 사용하여 개별 요소에 액세스 할 수 있습니다.
예
main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.
(setq x (vector 'a 'b 'c 'd 'e))
(write (length x))
(terpri)
(write (elt x 3))
코드를 실행하면 다음 결과가 반환됩니다.
5
D
시퀀스 수정
일부 시퀀스 함수는 시퀀스를 반복하고 명시적인 루프를 작성하지 않고 특정 요소를 검색, 제거, 계산 또는 필터링하는 것과 같은 일부 작업을 수행 할 수 있습니다.
다음 예제는 이것을 보여줍니다-
예 1
main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.
(write (count 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (remove 5 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (delete 5 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (substitute 10 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (find 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (position 5 '(1 5 6 7 8 9 2 7 3 4 5)))
코드를 실행하면 다음 결과가 반환됩니다.
2
(1 6 7 8 9 2 7 3 4)
(1 6 7 8 9 2 7 3 4)
(1 5 6 10 8 9 2 10 3 4 5)
7
1
예 2
main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.
(write (delete-if #'oddp '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (delete-if #'evenp '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (remove-if #'evenp '(1 5 6 7 8 9 2 7 3 4 5) :count 1 :from-end t))
(terpri)
(setq x (vector 'a 'b 'c 'd 'e 'f 'g))
(fill x 'p :start 1 :end 4)
(write x)
코드를 실행하면 다음 결과가 반환됩니다.
(6 8 2 4)
(1 5 7 9 7 3 5)
(1 5 6 7 8 9 2 7 3 5)
#(A P P P E F G)
시퀀스 정렬 및 병합
정렬 함수는 시퀀스와 두 개의 인수 조건자를 취하고 정렬 된 버전의 시퀀스를 반환합니다.
예 1
main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.
(write (sort '(2 4 7 3 9 1 5 4 6 3 8) #'<))
(terpri)
(write (sort '(2 4 7 3 9 1 5 4 6 3 8) #'>))
(terpri)
코드를 실행하면 다음 결과가 반환됩니다.
(1 2 3 3 4 4 5 6 7 8 9)
(9 8 7 6 5 4 4 3 3 2 1)
예 2
main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.
(write (merge 'vector #(1 3 5) #(2 4 6) #'<))
(terpri)
(write (merge 'list #(1 3 5) #(2 4 6) #'<))
(terpri)
코드를 실행하면 다음 결과가 반환됩니다.
#(1 2 3 4 5 6)
(1 2 3 4 5 6)
시퀀스 술어
every, some, notany 및 notevery 함수를 시퀀스 술어라고합니다.
이러한 함수는 시퀀스를 반복하고 Boolean 술어를 테스트합니다.
이 모든 함수는 첫 번째 인수로 술어를 취하고 나머지 인수는 시퀀스입니다.
예
main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.
(write (every #'evenp #(2 4 6 8 10)))
(terpri)
(write (some #'evenp #(2 4 6 8 10 13 14)))
(terpri)
(write (every #'evenp #(2 4 6 8 10 13 14)))
(terpri)
(write (notany #'evenp #(2 4 6 8 10)))
(terpri)
(write (notevery #'evenp #(2 4 6 8 10 13 14)))
(terpri)
코드를 실행하면 다음 결과가 반환됩니다.
T
T
NIL
NIL
T
매핑 시퀀스
우리는 이미 매핑 기능에 대해 논의했습니다. 마찬가지로map 함수를 사용하면 하나 이상의 시퀀스의 후속 요소에 함수를 적용 할 수 있습니다.
그만큼 map 함수는 n- 인수 함수와 n 시퀀스를 취하고 시퀀스의 후속 요소에 함수를 적용한 후 새 시퀀스를 반환합니다.
예
main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.
(write (map 'vector #'* #(2 3 4 5) #(3 5 4 8)))
코드를 실행하면 다음 결과가 반환됩니다.
#(6 15 16 40)