LISP-벡터

벡터는 1 차원 배열이므로 배열의 하위 유형입니다. 벡터와 목록을 집합 적으로 시퀀스라고합니다. 따라서 지금까지 논의한 모든 시퀀스 일반 함수와 배열 함수는 벡터에서 작동합니다.

벡터 만들기

벡터 함수를 사용하면 특정 값으로 고정 크기 벡터를 만들 수 있습니다. 임의의 수의 인수를 취하고 해당 인수를 포함하는 벡터를 반환합니다.

예 1

main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.

(setf v1 (vector 1 2 3 4 5))
(setf v2 #(a b c d e))
(setf v3 (vector 'p 'q 'r 's 't))

(write v1)
(terpri)
(write v2)
(terpri)
(write v3)

코드를 실행하면 다음 결과가 반환됩니다.

#(1 2 3 4 5)
#(A B C D E)
#(P Q R S T)

LISP는 # (...) 구문을 벡터의 리터럴 표기법으로 사용합니다. 이 # (...) 구문을 사용하여 코드에 리터럴 벡터를 만들고 포함 할 수 있습니다.

그러나 이들은 리터럴 벡터이므로 수정하는 것은 LISP에서 정의되지 않습니다. 따라서 프로그래밍을 위해 항상vector 기능 또는 더 일반적인 기능 make-array 수정하려는 벡터를 만듭니다.

그만큼 make-array함수는 벡터를 만드는보다 일반적인 방법입니다. 다음을 사용하여 벡터 요소에 액세스 할 수 있습니다.aref 함수.

예 2

main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.

(setq a (make-array 5 :initial-element 0))
(setq b (make-array 5 :initial-element 2))

(dotimes (i 5)
   (setf (aref a i) i))
   
(write a)
(terpri)
(write b)
(terpri)

코드를 실행하면 다음 결과가 반환됩니다.

#(0 1 2 3 4)
#(2 2 2 2 2)

포인터 채우기

그만큼 make-array 함수를 사용하면 크기 조정 가능한 벡터를 만들 수 있습니다.

그만큼 fill-pointer함수의 인수는 벡터에 실제로 저장된 요소의 수를 추적합니다. 벡터에 요소를 추가 할 때 채워질 다음 위치의 인덱스입니다.

그만큼 vector-push함수를 사용하면 크기 조정이 가능한 벡터 끝에 요소를 추가 할 수 있습니다. 채우기 포인터를 1 씩 증가시킵니다.

그만큼 vector-pop 함수는 가장 최근에 푸시 된 항목을 반환하고 채우기 포인터를 1 씩 감소시킵니다.

main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.

(setq a (make-array 5 :fill-pointer 0))
(write a)

(vector-push 'a a)
(vector-push 'b a)
(vector-push 'c a)

(terpri)
(write a)
(terpri)

(vector-push 'd a)
(vector-push 'e a)

;this will not be entered as the vector limit is 5
(vector-push 'f a)

(write a)
(terpri)

(vector-pop a)
(vector-pop a)
(vector-pop a)

(write a)

코드를 실행하면 다음 결과가 반환됩니다.

#()
#(A B C)
#(A B C D E)
#(A B)

벡터는 시퀀스이고 모든 시퀀스 함수는 벡터에 적용 할 수 있습니다. 벡터 함수에 대해서는 시퀀스 장을 참조하십시오.