Một lý do khiến các ngôn ngữ dựa trên Algol khuyến khích niềng răng trên dòng riêng của họ là để khuyến khích thêm nhiều dòng ở giữa các dấu ngoặc phân định mà không phải di chuyển niềng răng. Đó là, nếu một người bắt đầu với
if (pred)
{
printf("yes");
}
thật dễ dàng để đi cùng và thêm một tuyên bố khác trong niềng răng:
if (pred)
{
printf("yes");
++yes_votes;
}
Có dạng ban đầu là
if (pred)
{ printf("yes"); }
sau đó chúng ta phải "di chuyển" hai niềng răng, nhưng ví dụ của tôi quan tâm nhiều hơn đến cái niềng răng sau. Ở đây, các niềng răng đang phân định những gì dự định là một chuỗi các tuyên bố , chủ yếu được viện dẫn cho tác dụng phụ.
Ngược lại, Lisp thiếu các tuyên bố; mọi hình thức đều là biểu thức , mang lại một số giá trị, ngay cả trong một số trường hợp hiếm hoi (nghĩ về Common Lisp), giá trị đó được cố tình chọn là "không có giá trị" thông qua một (values)
hình thức trống . Nó ít phổ biến hơn để tìm các chuỗi biểu thức , trái ngược với các biểu thức lồng nhau . Mong muốn "mở một chuỗi các bước cho đến khi dấu phân cách đóng" không xuất hiện thường xuyên, bởi vì các câu lệnh biến mất và trả về các giá trị trở thành tiền tệ phổ biến hơn, hiếm khi bỏ qua giá trị trả về của biểu thức và do đó nhiều hơn hiếm khi đánh giá một chuỗi các biểu thức cho tác dụng phụ một mình.
Trong Common Lisp, progn
biểu mẫu là một ngoại lệ (như anh chị em của nó):
(progn
(exp-ignored-return-1)
(exp-ignored-return-2)
(exp-taken-return))
Ở đây, progn
đánh giá ba biểu thức theo thứ tự, nhưng loại bỏ các giá trị trả về của hai biểu thức đầu tiên. Bạn có thể tưởng tượng việc viết dấu ngoặc đơn cuối cùng trên dòng riêng của mình, nhưng lưu ý một lần nữa rằng vì hình thức cuối cùng là đặc biệt ở đây (không phải theo nghĩa chung Lisp là đặc biệt ), với cách xử lý riêng biệt, nhiều khả năng người ta sẽ thêm mới các biểu thức ở giữa chuỗi, thay vì chỉ "thêm một cái khác vào cuối", vì người gọi sau đó sẽ bị ảnh hưởng không chỉ bởi bất kỳ tác dụng phụ mới nào mà thay vào đó có thể là thay đổi giá trị trả về.
Làm cho đơn giản hóa tổng thể, các dấu ngoặc đơn trong hầu hết các phần của chương trình Lisp đang phân định các đối số được truyền cho các hàm giống như trong các ngôn ngữ giống như C, và không phân định các khối lệnh. Vì những lý do tương tự, chúng ta có xu hướng giữ các dấu ngoặc đơn ràng buộc một lệnh gọi hàm trong C gần với các đối số, do đó, chúng ta cũng làm như vậy trong Lisp, với ít động lực hơn để đi chệch khỏi nhóm gần đó.
Việc đóng dấu ngoặc đơn là nhập khẩu ít hơn nhiều so với việc thụt lề của biểu mẫu nơi chúng mở. Theo thời gian, một người học cách bỏ qua các dấu ngoặc đơn và viết và đọc theo hình dạng giống như các lập trình viên Python làm. Tuy nhiên, đừng để sự tương tự đó khiến bạn nghĩ rằng việc loại bỏ hoàn toàn dấu ngoặc đơn sẽ có giá trị. Không, đó là một cuộc tranh luận tốt nhất được lưu cho comp.lang.lisp
.