2011-11-08 41 views
5

Trong định nghĩa gói Common Lisp, sự khác biệt giữagói Common Lisp nét

(defpackage #:foo 
    (:use :cl) 
    (:export #:bar 
     #:baz)) 

(in-package #:foo) 

(defpackage :foo 
    (:use :cl) 
    (:export :bar 
     :baz)) 

(in-package :foo) 

tôi có nghĩa là gì. Khi nào tôi phải sử dụng ký tự "#"? Tất cả những biểu tượng này là uninternerd, phải không?

+1

Câu trả lời là ở đây: http://stackoverflow.com/questions/7894548/why-are-uninterned-symbols-used-for-package-names-and-exports-in-common-lisp –

Trả lời

8

:foo là cú pháp cho một biểu tượng từ khóa và #:foo là cú pháp cho một biểu tượng không được kiểm duyệt. Khi một biểu tượng được sử dụng chủ yếu để nhận được tại chuỗi đó là tên của nó (như trong defpackagein-package), tôi thích sử dụng các ký hiệu không được kiểm duyệt.

Dưới đây là các tùy chọn khác:

  • sử dụng một biểu tượng từ khóa; Tôi không thích cách biểu tượng từ khóa thực tập này hiển thị ở apropos và các địa điểm khác
  • sử dụng chuỗi; Tôi không thích cách này vô hiệu hóa chế độ "hiện đại" của Allegro
  • sử dụng ký hiệu đơn giản; Tôi không thích cách này cả hai thực tập một biểu tượng, và làm thế nào nó thực tập nó trong một gói phần mềm có khả năng ngẫu nhiên

Mà phong cách bạn hoặc bất cứ ai khác sử dụng là một vấn đề của hương vị.

+0

Cảm ơn bạn đã câu trả lời. Tôi sẽ áp dụng các biểu tượng không được kiểm duyệt để tránh một số xung đột trong không gian tên, vì liên kết này hiển thị http://stackoverflow.com/questions/7894548/why-are-uninterned-symbols-used-for-package-names-and-exports-in -ngôn-lisp. Tôi nghĩ là cách tiếp cận tốt hơn. – csgui