Algol 기반 언어가 자신의 라인에 중괄호를 권장하는 한 가지 이유는 중괄호를 이동하지 않고도 구분 중괄호 사이에 더 많은 라인을 추가하는 것을 권장하기 때문입니다. 즉, 시작하면
if (pred)
{
printf("yes");
}
중괄호 안에 다른 문장을 추가하고 추가하는 것이 쉽습니다 .
if (pred)
{
printf("yes");
++yes_votes;
}
원래 형태가 있었다
if (pred)
{ printf("yes"); }
그런 다음 두 개의 괄호를 "이동"해야 하지만 내 예는 후자를 더 중요하게 생각합니다. 여기서, 중괄호는 일련의 명령문으로 의도 된 것을 한정하고 있으며 , 대부분 부작용을 위해 호출됩니다.
반대로 Lisp에는 진술이 없습니다. 모든 형태는 표현 이며 일부 희귀 한 경우 (공통 리스프를 생각하는 경우에도) 빈 값을 통해 "값이없는"값으로 선택됩니다 (values)
. 중첩 식과 달리 식 시퀀스 를 찾는 것이 일반적이지 않습니다 . 문이 사라지고 반환 값이 더 일반적인 통화가되므로 식의 반환 값을 무시하는 것이 더 드물기 때문에 "닫는 구분 기호까지 일련의 단계를 열어야합니다"라는 욕구는 자주 발생하지 않습니다. 부작용 단독에 대한 일련의 표현을 평가하는 것은 드 rare니다.
Common Lisp에서 progn
형식은 예외입니다 (형제와 마찬가지로).
(progn
(exp-ignored-return-1)
(exp-ignored-return-2)
(exp-taken-return))
여기서는 progn
세 식을 순서대로 평가하지만 처음 두 개의 반환 값은 무시합니다. 마지막 닫는 괄호를 그 자체로 작성하는 것을 상상할 수 있지만 마지막 양식은 여기에서 특별하기 때문에 (공통 리스프에서는 특별 하지는 않지만) 별개의 처리로 인해 새로운 것을 추가 할 가능성이 더 큽니다 호출자는 새로운 부작용뿐만 아니라 반환 값의 변화에 영향을 받기 때문에 "중간에 다른 것을 추가하는 것"이 아니라 시퀀스 중간에있는 표현식을 사용합니다.
Lisp 프로그램의 대부분의 부분에서 괄호를 크게 단순화하면 C와 같은 언어와 마찬가지로 함수에 전달되는 인수를 구분할 수 있으며 명령문 블록을 구분할 수는 없습니다 . 같은 이유로 우리는 괄호를 C의 함수 호출에 인수로 묶는 경향을 유지하는 경향이 있으므로 Lisp에서도 같은 그룹을 벗어나는 동기 부여가 적습니다.
괄호를 닫는 것은 여는 형식의 들여 쓰기보다 훨씬 덜 중요합니다. 시간이 지나면 파이썬 프로그래머와 마찬가지로 괄호를 무시하고 모양별로 쓰고 읽는 법을 배웁니다. 그러나 유추로 인해 괄호를 완전히 제거 하는 것이 가치가 있다고 생각하게하지 마십시오 . 아니요,에 대한 토론은 최고입니다 comp.lang.lisp
.