Ví dụ bạn muốn đặt tên cỡ chữ:
(defconstant +large+ 3)
(defconstant +medium+ 2)
(defconstant +small+ 1)
Bạn có thể viết một macro để làm cho điều đó ngắn hơn.
Định nghĩa liên tục trên thường được viết CHỈ khi các số này cần được chuyển đến một số mã không phải Lisp bên ngoài.
Nếu không, người dùng sẽ chỉ sử dụng các ký hiệu từ khóa:: lớn,: trung bình và: nhỏ.
Bạn có thể kiểm tra chúng bằng EQ và mọi thứ sử dụng một số thử nghiệm để bình đẳng.
(let ((size :medium))
(ecase size
(:small ...)
(:medium ...)
(:large ...)))
Bạn cũng có thể viết phương pháp cho nó:
(defmethod draw-string (message x y (size (eql :large))) ...)
Như đã đề cập, bạn có thể định nghĩa một kiểu thiết lập:
(deftype size() '(member :small :medium :large))
Sau đó, bạn có thể kiểm tra nếu một cái gì đó là một trong những người:
(let ((my-size :medium))
(check-type my-size size))
Phía trên sẽ báo hiệu lỗi nếu kích thước của tôi không phải là một trong số: nhỏ, trung bình hoặc lớn.
Bạn cũng có thể sử dụng các loại trong một hình thức defclass:
(defclass vehicle()
((width :type size :initarg :width)))
Bây giờ bạn sẽ tạo các đối tượng như ở đây:
(make-instance 'vehicle :width :large)
Một số triển khai Common Lisp sẽ kiểm tra khi bạn thiết lập các khe đối với một số giá trị bất hợp pháp.
Nếu bây giờ bạn tạo các đối tượng của xe hạng, các vị trí sẽ là một trong số: lớn, trung bình hoặc nhỏ. Nếu bạn nhìn vào đối tượng trong trình gỡ lỗi, thanh tra hoặc một số công cụ khác, bạn sẽ thấy các tên biểu tượng và không phải là 1, 2 hoặc 3 (hoặc bất kỳ giá trị nào bạn thường sử dụng).
Đây là một phần của phong cách Lisp: sử dụng tên biểu tượng khi có thể. Chỉ sử dụng các ký hiệu có giá trị số trong mã giao diện cho các chức năng nước ngoài (như gọi mã C bên ngoài sử dụng enums).
Có, nhưng sử dụng từ khóa tốt hơn. – kmkaplan
Đó là một điểm tốt: bằng cách sử dụng từ khóa bạn tránh phải lo lắng về những gói biểu tượng của bạn. –
Thực ra, các hàm chung chỉ có thể chuyên về các lớp, không phải kiểu tùy ý. –