Biểu tượng khóa
:foo
là một keyword biểu tượng.
- thực tập nội trú và xuất khẩu từ
KEYWORD
gói
- liên tục bị ràng buộc vào bản thân
Cách sử dụng
ký tự từ khóa được sử dụng khi người ta cần sự kết hợp của các thuộc tính sau:
- biểu tượng là cấu trúc đúng dữ liệu
- những biểu tượng có cùng tên phải là duy nhất (bằng cách thực tập chúng trong một gói phần mềm) -> gói
KEYWORD
- gói khác nhau không cần thiết hoặc muốn -> gói
KEYWORD
- viết biểu tượng sẽ dễ dàng bởi không cần phải trích dẫn họ ->
:foo
tốt hơn so với ':foo
- khả năng hoạt động như một biến với giá trị khác nhau là không cần thiết ->
:foo
đánh giá để :foo
chính nó và chỉ để :foo
Trong các ký hiệu chung Lisp thường có thể nằm trong một gói (loại không gian tên).
Biểu tượng chưa được công nhận bar
trong gói foo
được viết là foo::bar
. Dấu hai chấm nằm giữa tên gói và tên biểu tượng.
Biểu tượng đã xuất sau đó được viết là foo:bar
. Một dấu hai chấm được sử dụng.
Nếu biểu tượng có sẵn trong gói hiện tại thì được viết là bar
không có gói.
Gói KEYWORD
Có một gói đặc biệt gọi là KEYWORD
. Một biểu tượng bar
trong gói đó đơn giản và luôn được viết là :bar
.
Ví dụ
Những biểu tượng từ khóa cũng có những đặc tính thú vị: những biểu tượng sẽ tự động xuất khẩu từ gói KEYWORD
(vì vậy keyword::bar
, keyword:bar
, ::bar
và :bar
là tất cả các biểu tượng giống nhau) và họ đánh giá cho riêng mình:
CL-USER 5 > :bar
:BAR
CL-USER 6 > (describe :bar)
:BAR is a SYMBOL
NAME "BAR"
VALUE :BAR
FUNCTION #<unbound function>
PLIST NIL
PACKAGE #<The KEYWORD package, 0/4 internal, 5830/8192 external>
CL-USER 7 > (eq 'keyword::bar ':bar)
T
CL-USER 8 > (eq :bar ':bar) ; quoted or unquoted, each subform evaluates to :bar
T
Cách sử dụng
ký tự từ khóa được sử dụng ví dụ như tên trong đối số tên:
(defun foo (&key bar) (+ bar 10))
(foo :bar 7)
Thông thường họ cũng được sử dụng trong lập luận để dụ và xây dựng cấu trúc.
(defstruct node state parent action)
DEFSTRUCT
là macro Lisp chung và tạo nhiều chức năng. Một trong số đó là hàm MAKE-NODE
, có thể được sử dụng là:
(make-node :state 'open
:parent some-parent
:action an-action)
Lưu ý: đôi khi dữ liệu cũng có thể là từ khóa. Ví dụ trong hình thức trên, nhà nước có thể :open
và không open
:
(make-node :state :open
:parent some-parent
:action an-action)
Bạn viết: "Một biểu tượng ** xuất khẩu ** ... được viết là' foo:. Bar' * Một tràng duy nhất được sử dụng * .. "và cũng" các biểu tượng [từ khóa] được tự động xuất **, "nhưng ví dụ của bạn hiển thị' (eq 'keyword :: bar': bar) '. Tại sao bạn sử dụng dấu hai chấm nếu từ khóa luôn được xuất? Có thể '::' được sử dụng với cả hai biểu tượng xuất và không xuất? –
@GlennSlayden Có, mọi biểu tượng được lưu trữ, xuất hoặc không xuất, có thể được viết dưới dạng gói :: tên. Chỉ các biểu tượng được xuất có thể được viết dưới dạng tên gói:. Chỉ các ký hiệu từ khóa mới có thể được viết là: name. –
Để hoàn thành, còn ':: bar' thì sao? Liệu nó vẫn tham chiếu đến gói 'KEYWORD', hay bây giờ nó sẽ là một dạng toàn cầu khác? Xin lỗi vì là một newbie LISP. –