문제

다음의 차이점은 무엇입니까?

(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를 배우는 과정에 있다면, 문제는 아마도 공간이 괄호에 대해 중요하지 않으며 정답은 당신이 준 것입니다.

특히, 닫는 괄호 후 공간은 항상 추가되지만 인간의 가독성 목적을위한 것입니다. 인쇄하지 않아야한다는 것은 의미가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top