Một số tài liệu tham khảo lịch sử là do.
Emacs Lisp mượn nhiều thứ từ Common Lisp, nhưng sự tương đồng chỉ là bề mặt sâu. Biểu tượng dấu hai chấm trong Common Lisp là vòng loại không gian tên. Tên biểu tượng Canonical có hai phần: tên của gói và tên của biểu tượng trong gói đó, ví dụ, cl-user:apropos
là một biểu tượng được xác định trong gói cl-user
. Ngoài ra còn có một gói từ khóa đặc biệt được nhập tự động bởi Common Lisp khi nó được bắt đầu. Gói này được sử dụng để liên lạc giữa các gói khác (để nếu các gói cần gửi thông tin tượng trưng cho nhau, họ sẽ không đấu tranh về việc ai phải khai báo). Như bạn có thể đoán, các ký hiệu trong gói đó được viết bằng dấu hai chấm đầu.
Emacs Lisp không có khái niệm về các gói, nhưng dấu hai chấm vẫn đặc biệt ở chỗ nó hướng dẫn người đọc diễn giải biểu thức là biểu tượng tự đánh giá (tức là nó là một biến có giá trị là chính biến đó). Có một số biểu tượng tự đánh giá tích hợp như vậy: t
và nil
là những ví dụ tôi sẽ viết về sau.
Dấu nháy đơn cũng được mượn từ Common Lisp, trong đó nó là macro đọc tiêu chuẩn (nghĩa là mã mà trình thông dịch Lisp thực thi trong khi đọc trong nguồn của chương trình). Nó mở rộng như sau : 'x -> (quote x)
, trong đó (quote ...)
là một hình thức đặc biệt ngăn trình thông dịch Lisp đánh giá nội dung của biểu thức bên trong. Emacs Lisp có ba built-in macro đọc: '
, `
và #
, nhưng bạn không thể thêm riêng bạn. Hai cái đầu tiên mở rộng sang (quote ...)
, tuy nhiên cái thứ hai cho phép cú pháp đặc biệt để xây dựng biểu thức không được đánh giá. #
mở rộng (function ...)
thành biểu mẫu, hướng dẫn trình thông dịch rằng giá trị phải được tra cứu trong không gian tên hàm.
Các biểu tượng trong Emacs Lisp phải đánh giá một số giá trị (tương tự như các biến trong các ngôn ngữ khác) nếu không đó là lỗi. Tuy nhiên, bạn có thể ngăn chặn đánh giá bằng cách sử dụng mẫu báo giá.
Cuối cùng, sự khác biệt giữa:
(search-forward "something" nil 'noerror)
và
(search-forward "something" nil :noerror)
Có phải trong trường hợp đầu tiên bạn gọi search-forward
bằng một ký hiệu không có giá trị, chỉ biết tên đó và trong trường hợp thứ hai, bạn đã gọi hàm này với một ký hiệu có giá trị chính là ký hiệu này. Vì vậy, chức năng này không quan tâm đến việc bạn sử dụng cái nào.
Các loại là một công cụ lập trình quan trọng để xác minh tự động các chương trình. Hệ thống loại Emps Lisp tương tự như Common Lisp ở chỗ loại phổ quát của nó (được viết là t
) là loại mà tất cả các loại khác có nguồn gốc. Mặt khác, nil
là loại mà không có loại nào có nguồn gốc (phần bù của t
). Điều này không giống như nhiều ngôn ngữ lập trình phổ biến, có thể không có khái niệm về loại phổ quát hoặc có loại Boolean riêng biệt.
Tuy nhiên, một lần nữa, thật không may, Emacs Lisp đã không sao chép chính xác phần này từ Common Lisp và type-of
chức năng này cho kết quả khó hiểu cho t
và nil
.
Emacs Lisp:
(type-of t) ; symbol
Lisp thường gặp
(type-of t) ; BOOLEAN
Phần mở rộng Lisp chung của Emacs Lisp có chức năng cl-typep
, tuy nhiên, có thể giúp hiểu mối quan hệ. Ví dụ
(cl-typep 'noerror t) ; t
tức là bất cứ điều gì 'noerror
nó là loại t
.
nil
giá trị không được xử lý giống nhau bởi hàm đã cho, trong mã của tôi, tôi chuyển một ký hiệu có cùng tên hoặc tương tự với tên tham số được sử dụng trong mô tả hàm và thường là chữ hoa. Điều này phục vụ như một lời nhắc nhở cho tôi, khi tôi đọc mã. Ví dụ(search-forward "abc" nil 'NOERROR)
. Nó là hữu ích nhất cho các đối số tùy chọn hiếm khi được sử dụng.