2011-02-05 47 views
12

Có vẻ như cả haiSự khác nhau giữa 'và #' trong Lisp là gì?

(mapcar 'car '((foo bar) (foo1 bar1))) 

(mapcar #'car '((foo bar) (foo1 bar1))) 

công việc như nhau.

Và tôi cũng biết ' có nghĩa là (biểu tượng báo giá) và #' có nghĩa là (hàm chức năng-tên).

Nhưng điểm khác biệt cơ bản là gì? Tại sao cả hai đều hoạt động trong mapcar trước đây?

Trả lời

13
'foo 

đánh giá biểu tượng FOO.

#'foo 

đánh giá hàm được liên kết với tên FOO.

Trong Lisp, một biểu tượng có thể được gọi là hàm khi biểu tượng FOO có một hàm ràng buộc. Ở đây CAR là một biểu tượng có chức năng ràng buộc.

Nhưng điều này không làm việc:

(flet ((foo (a) (+ a 42))) 
    (mapcar 'foo '(1 2 3 4 5))) 

Đó là bởi vì FOO như một biểu tượng không truy cập vào các chức năng từ vựng địa phương và hệ thống Lisp sẽ phàn nàn khi foo không phải là một chức năng được xác định ở nơi khác.

Chúng tôi cần phải viết:

(flet ((foo (a) (+ a 42))) 
    (mapcar #'foo '(1 2 3 4 5))) 

Ở đây (chức năng foo) hoặc ký hiệu viết tắt của nó # 'foo đề cập đến từ vựng chức năng FOO địa phương.

Cũng lưu ý rằng trong

(funcall #'foo ...) 

vs

(funcall 'foo ...) 

này sau đó có thể làm thêm một gián tiếp, vì nó cần phải tra cứu hàm từ biểu tượng, trong khi # 'foo biểu thị chức năng trực tiếp.

Tóm tắt:

Nếu một biểu tượng có chức năng ràng buộc, gọi một chức năng thông qua các biểu tượng hoạt động.

9

Tại sao cả 2 đều hoạt động trong bản đồ trước?

Các tài liệu cho mapcar nói:

Nếu chức năng là một biểu tượng, nó được buộc thành chức năng như thể bởi symbol-function.

1

Hãy thử chuyển một hàm ẩn danh (lambda) đến mapcar và bạn sẽ thấy rằng #' là bắt buộc vì bản thân báo giá mong đợi một biểu tượng bị ràng buộc với hàm, nhưng biểu tượng không tồn tại trong một hàm có tên:

CL-USER> (mapcar '(lambda (x) (format t "it is ~d" x)) (list 3 5 7)) 
; Evaluation aborted on #<TYPE-ERROR expected-type: (OR FUNCTION SYMBOL) 
      datum: (LAMBDA (X) (FORMAT T "it is ~d" X))>. 

vs:

CL-USER> (mapcar #'(lambda (x) (format t "it is ~d" x)) (list 3 5 7)) 
it is 3it is 5it is 7 
(NIL NIL NIL) 
Các vấn đề liên quan