수색…


국제 대회 목록

일부 언어에는 목록 데이터 구조가 포함됩니다. Common Lisp 및 Lisp 계열의 다른 언어는 목록을 광범위하게 사용합니다 (이름 Lisp은 LISt 프로세서의 아이디어를 기반으로합니다). 그러나 Common Lisp에는 실제로 원시 목록 데이터 유형이 포함되어 있지 않습니다. 대신 목록은 규칙에 따라 존재합니다. 국제 대회는 두 가지 원칙에 달려 있습니다.

  1. 기호 nil 은 빈 목록입니다.
  2. 비어 있지 않은 목록은 자동차 가 목록의 첫 번째 요소이고, 그 cdr 이 나머지 목록 인 cons 셀 입니다.

목록에있는 것이 전부입니다. 만약 당신이 콩 셀이란 무엇입니까 라는 예제를 읽었 습니까? , 당신은 car가 X이고 그의 cdr이 Y 인 죄수 셀이 (X, Y) 로 쓰여질 수 있음을 알 수 있습니다. 즉 위의 원칙에 따라 목록을 작성할 수 있습니다. 요소 1, 2 및 3의 목록은 간단합니다.

(1 . (2 . (3 . nil)))

그러나리스트는 Lisp 계열의 언어에서 매우 일반적이므로, cons 셀의 간단한 점선 쌍 표기법 이상의 특수 인쇄 규칙이 있습니다.

  1. 기호 nil() 로도 쓰여질 수 있습니다.
  2. 하나의 cons 셀의 cdr이 또 다른리스트 ( () 또는 cons 셀) 인 경우, 하나의 cons 셀에 점으로 된 쌍 표기법을 쓰는 대신 "list notation"이 사용됩니다.

목록 표기법은 몇 가지 예를 통해 가장 명확하게 표시됩니다.

(x . (y . z))   === (x y . z)
(x . NIL)       === (x)
(1 . (2 . NIL)) === (1 2)
(1 . ())        === (1)

목록의 마지막 cdr에 도달 할 때까지 목록의 요소는 괄호 안에 연속 된 순서로 작성됩니다. 마지막 cdr이 nil (빈 목록)이면 최종 괄호가 작성됩니다. 마지막 cdr이 nil 이 아닌 경우 (이 경우 목록이 부적절한 목록 이라고 함) 점이 작성되고 그 마지막 cdr이 작성됩니다.

단점 셀이란 무엇입니까?

cons cell은 점선으로도 알려져 있기 때문에 단순히 두 개의 객체 쌍입니다. cons 셀은 함수 cons 의해 생성되고, 쌍의 요소는 carcdr 함수를 사용하여 추출됩니다.

(cons "a" 4)

예를 들어, 이것은 첫 번째 요소 ( car 로 추출 할 수 있음)가 "a" 이고 두 번째 요소 ( cdr 로 추출 할 수 있음)가 4 인 쌍을 반환합니다.

(car (cons "a" 4))
;;=> "a"

(cdr (cons "a" 4))
;;=> 3

단점 셀은 점으로 된 쌍 표기법으로 인쇄 할 수 있습니다.

(cons 1 2)
;;=> (1 . 2)

단점 셀은 점으로 된 쌍 표기법으로 읽을 수도 있으므로

(car '(x . 5))
;;=> x

(cdr '(x . 5))
;;=> 5

(cons 셀의 인쇄 된 형태도 조금 더 복잡 할 수 있습니다. 더 자세한 내용은 cons 셀에 관한 예제를 목록으로보십시오.)

그게 다야. cons 셀은 함수 cons 의해 생성 된 요소 쌍이며 carcdr 요소를 추출 할 수 있습니다. 단순성 때문에 합집합 셀은보다 복잡한 데이터 구조를위한 유용한 빌딩 블록이 될 수 있습니다.

단점 셀 스케치

cons와 list의 의미를 더 잘 이해하기 위해 이러한 종류의 구조를 그래픽으로 표현하는 경우가 종종 있습니다. 합집합 셀은 대개 두 개의 상자로 표시됩니다.이 상자에는 carcdr 값을 가리키는 두 개의 화살표가 포함되거나 직접 값이 포함됩니다. 예를 들어,

(cons 1 2)   
;; -> (1 . 2)

다음 도면 중 하나를 사용하여 표현할 수 있습니다.

이러한 표현은 순수하게 개념이며, 값이 셀에 포함되어 있다는 사실을 표시하지 않거나 셀에서 지적되는 참고 : 일반적으로이, 값의 종류, 최적화 수준 등 구현에 따라 달라집니다 나머지 예제에서는보다 일반적으로 사용되는 드로잉의 첫 번째 종류를 사용합니다.

그래서, 예를 들면 :

(cons 1 (cons 2 (cons 3 4)))   ; improper “dotted” list
;; -> (1 2 3 . 4)

다음과 같이 표현됩니다.

동안:

(cons 1 (cons 2 (cons 3 (cons 4 nil))))  ;; proper list, equivalent to: (list 1 2 3 4)
;; -> (1 2 3 4)

다음과 같이 표현됩니다.

다음은 나무와 같은 구조입니다.

(cons (cons 1 2) (cons 3 4))
;; -> ((1 . 2) 3 . 4)         ; note the printing as an improper list

마지막 예제는이 표기법이 언어의 중요한 의미 측면을 이해하는 데 어떻게 도움이되는지 보여줍니다. 먼저, 이전과 비슷한 표현식을 작성합니다.

(cons (cons 1 2) (cons 1 2))
;; -> ((1 . 2) 1 . 2)

다음과 같이 일반적인 방법으로 표현할 수 있습니다.

그런 다음 이전 표현식과 분명히 다른 표현식을 작성합니다.이 표현식은 결과의 인쇄 된 표현으로 확인됩니다.

(let ((cell-a (cons 1 2)))
  (cons cell-a cell-a))
;; -> ((1 . 2) 1 . 2)

우리는도를 그릴 경우에, 우리는 식의 의미가 동일한 셀의 값이기 때문에, 서로 다른 것을 볼 수있는 car 부품 및 cdr 외주의 일부 cons (이것이, cell-a 공유) :

언어 수준에서 두 결과의 의미가 실제로 다르다는 사실은 다음 테스트를 통해 확인할 수 있습니다.

(let ((c1 (cons (cons 1 2) (cons 1 2)))
      (c2 (let ((cell-a (cons 1 2)))
            (cons cell-a cell-a))))
  (list (eq (car c1) (cdr c1))
        (eq (car c2) (cdr c2)))
;; -> (NIL T)

eq 때문에 거짓carcdrc1 (즉 의해 사실 구조적으로 동일 equal ), 그러나 제 시험 결과는 이후 사실이지만, (즉, "동일한 공유 구조") "동일한"아니다 carc2 cdr동일합니다 . 즉 , 동일한 구조 입니다.



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