2011-12-19 33 views
14

Cú pháp, dấu hai chấm nào trước biến trong Common Lisp, có nghĩa là gì? Tôi đã thấy các chương trình như vậy, và tôi sẽ trình bày một số mã mẫu ở đây, trong một tập hợp lớn các hàm.Tại sao dấu hai chấm trước biến trong Common Lisp

(defun expand (successorf node) 
    (mapcar (lambda (action-state-cost) 
      (let ((action (car action-state-cost)) 
       (state (cadr action-state-cost)) 
       (cost (caddr action-state-cost))) 
      (make-node :state state :parent node 
         :action action :path-cost (+ (node-path-cost node) cost) 
         :depth (1+ (node-depth node))) 
      )) 
     (funcall successorf (node-state node)) 
    )) 

Trả lời

18

Chúng không phải là biến; đó là những từ khóa. Chúng là một loại mã thông báo hiệu quả đặc biệt, tương tự như “nguyên tử” trong các ngôn ngữ khác. Đó là một cách thuận tiện, tích hợp để truyền các tham số có tên (và, hầu như luôn luôn, tùy chọn) vào một cuộc gọi hàm.

http://www.gigamonkeys.com/book/functions.html mô tả cú pháp của các cuộc gọi hàm.

27

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: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) 
+0

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? –

+0

@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. –

+0

Để 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. –

Các vấn đề liên quan