Mặc dù chúng tôi viết chúng với cú pháp dấu ngoặc đơn giống nhau
Và đó cơ bản là câu trả lời cho câu hỏi của bạn.
chúng ta cần học cách làm việc của từng người
Mặc dù có thể giới thiệu DSL với cú pháp không quá phức tạp như Common Lisps loop
sử dụng macro thông thường (tôi sẽ bỏ macro người đọc ra khỏi điều này), chúng chủ yếu được sử dụng để kiểm soát đánh giá và vẫn sẽ sử dụng cú pháp biểu thức s thông thường. Một tính năng quan trọng là ngay cả các loop
macro giống như phức tạp hơn cũng có thể được đọc bằng cùng một trình đọc sexpr cũ.
Mặc dù đúng là bạn sẽ phải tìm hiểu về các macro khác nhau và hình thức nhập liệu mà chúng sử dụng, hãy nói Common Lisp cond
với cond
việc giảm bớt một lớp lồng của nó so với Clojure , nó không chỉ giữ cho macro, mà còn cho chức năng thường xuyên. Hãy tưởng tượng một hàm thông thường lấy một danh sách trích dẫn của một cấu trúc cụ thể làm đối số - bạn vẫn sẽ phải tuân theo cấu trúc đầu vào dự kiến, cho dù hàm đó có biến đổi mã hay không, mong đợi một loại nào đó tồn tại, plist, cây hoặc một cái gì đó hoàn toàn khác.
Bất cứ khi nào bạn gặp chức năng mới, sẽ có một số API bạn sẽ phải học. Điều đó cũng sẽ áp dụng cho một ngôn ngữ chỉ cho phép function(arg1, arg2, …, argN)
cú pháp nghiêm ngặt - bạn vẫn phải tìm hiểu các đối số dự kiến là gì, tác dụng phụ xảy ra và đầu ra của bất kỳ chức năng nào là gì.
Điều dễ dàng hơn về cú pháp Lisp so với một ngôn ngữ như Scale, là mọi thứ được thể hiện ít nhiều giống nhau và chính mã đã sử dụng các biểu diễn và cấu trúc dữ liệu này (đó sẽ là tính đồng nhất mà mọi người đang nói đến). Sự khác biệt về độ phức tạp cú pháp này sẽ trở nên khá rõ ràng nếu bạn cố gắng viết một trình phân tích cú pháp Lisp hoặc Clojure và sau đó là một trình phân tích cú pháp Scala. Bạn sẽ phải đối phó với một ngữ pháp phức tạp hơn nhiều - các quy tắc phức tạp hơn liên quan đến quyền ưu tiên, khoảng trắng, sự mơ hồ, nhiều ngoại lệ, v.v.