LISP 차이 (cons 'a (cons'b 'c))과 (cons'a '(bc))
문제
다음의 차이점은 무엇입니까?
(cons 'a (cons 'b 'c)) ;; (A B . C)
그리고
(cons 'a '(b.c)) ;; (A B.C)
단점을 사용하여 다음 목록 ((AB) .C)를 만들어야하므로 ""를 이해하려고 노력하고 있습니다. .
르: 나는 다음이있다 (cons (cons 'a 'b) 'c)
그러나 그것은 생산됩니다 ((A . B) . C)
그리고 아닙니다 ((A.B).C)
(추가 공간에 주목하십시오)
해결책
공간은 목록 토큰을 분리하는 데 사용됩니다. A.B
단일 토큰입니다. (A.B)
단일 요소가있는 목록입니다. (A . B)
컨소시 셀입니다 A
자동차와 B
CDR.
단점 셀은 한 쌍의 "사물"(물체)입니다. 귀하의 경우에는 이러한 것들이 상징이며 이름이 지정됩니다. A
, B
, 등 .. 그러한 셀의 인쇄 된 표현은 (A . B)
, 예를 들어. 이것을 "DOT 표기법"이라고합니다. 첫 번째 요소는 "CAR", 두 번째 "CDR"이라고합니다.
함수 cons
그러한 셀을 만듭니다. (cons 'a 'b)
따라서 셀을 생성합니다 (A . B)
. 이름은 항상 내부적으로 상향 조정됩니다.
이것은 당신의 선생님이 원했을 가능성이 높습니다. ((A . B) . C)
올바른 출력이며 코드는 정답입니다. 이것은 자동차가 다른 셀을 가리키는 셀이며 CDR에는 C
. 다른 세포는 차가 포함 된 세포입니다. A
그리고 CDR B
.
그건 그렇고, a 목록 자동차가 항상 값을 보유하고 CDR은 나머지 목록을 가리키도록 그러한 단점 셀의 선형 체인입니다. 마지막 CDR 포인트는 어디에도 없습니다 (LISP에서 NIL이라고 함). 도트 표기법에서는 목록이 예를 들어 있습니다 (A . (B . (C . NIL)))
. 목록이 중요하므로 다음과 같이 짧게 쓸 수 있습니다. (A B C)
. 마지막 CDR에 nil 대신 값이 있으면 DOT 표기법 (예 : (A . (B . (C . D))))
작성할 수 있습니다 (A B C . D)
.
다른 팁
.
두 문자 사이는 기호의 일부입니다. b.c
세 문자 이름을 가진 상징입니다. 비, ., 그리고 씨.
입력 한 경우 FOO.BAR
, LISP는 하나의 기호로 읽습니다.
입력 한 경우 (FOO.BAR)
LISP는 내용으로 하나의 기호가있는 목록으로 읽습니다.
입력 한 경우 (FOO . BAR)
Lisp는 그것을 FOO
로서 자동차 그리고 BAR
로서 CDR.
.
그것을 분리하는 데 사용됩니다 자동차 그리고 CDR 단점의 : (a . b)
. 주변의 공간에 주목하십시오 .
.
(cons 'b 'c)
기호로 단점 셀을 만듭니다 b
로서 자동차 그리고 상징 c
로서 CDR. 그것은 다음과 같이 작성되었습니다 (b . c)
.
(cons 'a '(b.c))
두 가지 기호 목록을 작성하고 a
그리고 b.c
. 그것은 다음과 같이 작성되었습니다 (a b.c)
.
((A.B).C)
항상 인쇄됩니다 ((A.B) . C)
. 또한 목록이 아닙니다.
((a.b) . c)
목록이있는 단점입니다 (a.b)
로서 자동차 그리고 상징 c
로서 CDR.
이것이 LISP를 배우는 과정에 있다면, 문제는 아마도 공간이 괄호에 대해 중요하지 않으며 정답은 당신이 준 것입니다.
특히, 닫는 괄호 후 공간은 항상 추가되지만 인간의 가독성 목적을위한 것입니다. 인쇄하지 않아야한다는 것은 의미가 없습니다.