2008-11-17 28 views
9

Tôi có một danh sách lớn các biến toàn cục mà mỗi biến có chức năng thiết lập riêng của chúng. Mục tiêu của tôi là đi qua danh sách này, gọi hàm thiết lập của từng mục và tạo một số thống kê về dữ liệu được tải trong biến phù hợp. Tuy nhiên, những gì tôi đang cố gắng hiện không hoạt động và tôi cần trợ giúp để chương trình của tôi gọi các chức năng cài đặt.Tên hàm là chuỗi trong Lisp?

Các biến toàn cầu và các hàm thiết lập của chúng phân biệt chữ hoa chữ thường vì nó xuất phát từ XML và cần thiết cho tính duy nhất.

Dữ liệu trông giống như sau:

'(ABCD ABC\d AB\c\d ...) 

và các chức năng thiết lập giống như thế này:

(defun setup_ABCD... 
(defun setup_ABC\d... 

Tôi đã thử concatenating chúng lại với nhau và biến chuỗi kết quả vào một chức năng, nhưng điều này cản trở không gian tên của hàm thiết lập đã tải trước đó. Dưới đây là cách tôi đã cố thực hiện điều đó:

(make-symbol (concatenate 'string "setup_" (symbol-name(first '(abc\d))))) 

Nhưng việc sử dụng funcall sẽ không hoạt động. Làm thế nào tôi có thể nhận được một chức năng gọi từ điều này?

+0

Nếu câu trả lời của người trả lời không có tác dụng, sẽ tốt hơn nếu đánh dấu nó là được chấp nhận bằng cách nhấp vào dấu tích. – Pablo

+0

Tiêu chuẩn đặt tên trong Lisp là sử dụng dấu gạch nối, chứ không phải dấu gạch dưới. Ngoài ra, trình đọc sẽ chồng lên tất cả các ký hiệu trong nội bộ, và tiêu chuẩn là viết chúng trong trường hợp thấp hơn, vì vậy cách tiêu chuẩn để gọi hàm thiết lập của bạn là 'setup-abcd'. – Svante

+0

Xin lỗi vì đã đánh dấu chậm! Ngoài ra các fns thiết lập được viết bởi một không lisper. Tôi đã cho anh mượn bản sao cuốn sách Norvigs Lisp/AI của tôi. – ktdh

Trả lời

12

Đó là vì MAKE-SYMBOL trả về một biểu tượng không bị chặn. Bạn nên sử dụng INTERN thay thế.

+0

BINGO! Tôi đã hy vọng nó sẽ là đơn giản, Cảm ơn một bó! – ktdh

+0

Vâng, Chet, bước tiếp theo: chấp nhận câu trả lời. – Svante

+0

bạn có thể đưa ra một ví dụ để xi măng này cho tôi, tôi vẫn chỉ là một chút bối rối: ( – ajivani

0

Tôi muốn sử dụng INTERN hoặc (có thể, bạn phải có hồ sơ để chắc chắn 100% nó hữu ích) một hàm trợ giúp thực hiện nối chuỗi và tìm kiếm ban đầu, sau đó lưu trữ kết quả trong một hashtable (keyed tắt biểu tượng gốc). Điều đó có thể nhanh hơn giải pháp INTERN/CONCATENATE tinh khiết, có khả năng sẽ tạo ra ít rác thải thoáng qua, nhưng sẽ kết thúc bằng cách sử dụng lưu trữ lâu dài hơn.

cái gì đó dọc theo dòng:

 
(defvar *symbol-function-map* (make-hash-table)) 

(defun lookup-symbol (symbol) 
    (or (gethash symbol *symbol-function-map*) 
     (let ((function-name (intern (concatenate 'string "setup_" (symbol-name symbol))))) 
     (setf (gethash symbol *symbol-function-map*) (symbol-function function-name))))) 

Nếu bạn yêu cầu tên của hàm, chứ không phải là chức năng riêng của mình, bỏ qua cuộc gọi đến SYMBOL-CHỨC NĂNG.

0
(funcall (read-from-string (concatenate 'string "setup_" (symbol-name(first '(abc\d)))))) 

cũng hoạt động.

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