답변:
LISP에서 일한 지 얼마되지 않았지만, 아시다시피, 기본 비 원자 구조는 목록입니다. 그 밖의 모든 것은이를 기반으로합니다. 따라서 각 원자가 노드 인 원자 목록과 노드를 다른 노드에 연결하는 모서리 목록이있을 수 있습니다. 다른 방법도 있다고 확신합니다.
아마도 이런 식으로 뭔가 :
(
(a (b c)),
(b (a c)),
(c (a b d)),
(d (c))
)
다음과 같은 그래프를 줄 수 있습니다.
a <-> b <-> c <-> d ^ ^ | | + --------- +
화려하고 싶다면 가중치도 추가 할 수 있습니다.
(
(a (b 1.0 c 2.0)),
(b (a 1.0 c 1.0)),
(c (a 1.3 b 7.2 d 10.5)),
(d (c -10.5))
)
당신이에 관심이있을 수 : CL-그래프 (구글 - 검색 문구를 "혀짤배기 그래프 구조"에 의해 발견)
기능적 언어는 비 기능적 언어와 동일한 방식으로 데이터 구조를 처리합니다. 인터페이스를 구현에서 분리하고 추상 데이터 유형을 생성합니다.
Lisp에서 추상 데이터 유형을 작성할 수 있습니다. 예를 들어, 그래프의 경우 몇 가지 함수를 원할 수 있습니다.
(define (get-vertices graph) ;; gets all the vertices from a graph
...)
(define (get-edges graph) ;; gets all the edges from a graph
...)
(define (get-weight vertex-from vertex-to) ;; get the weight of a specific vertex
...)
해당 인터페이스를 그래프에 작성하면 실제 데이터 구조를 여러 가지 방법으로 구현하여 프로그래머 효율성, 유연성 및 계산 효율성과 같은 요소를 최적화 할 수 있습니다.
핵심은 그래프를 사용하는 코드가 그래프 인터페이스 만 사용하고 기본 구현에 액세스하지 않는지 확인하는 것입니다. 이렇게하면 클라이언트 코드가 실제 구현과 분리되어 클라이언트 코드가 더 단순 해집니다.
Common Lisp에서 트리를 표현 해야하는 경우 목록을 사용하거나 (빠른 해킹 인 경우) 트리 클래스를 정의하거나 구조체를 정의하지만 클래스는 일반 함수와 잘 상호 작용하므로 왜 그렇지 않습니까? .
(defclass tree ()
((node :accessor node :initarg :node)
(children :accessor children :initarg :children)))
코드에 리터럴 트리가 필요한 경우 make-tree
원하는 트리의 목록 표현을 사용하여 트리 객체 트리로 변환하는 함수를 정의 할 수도 있습니다.