2009-12-05 48 views

Trả lời

12

Chúng khá hoán đổi cho nhau. Câu trả lời là functioncho phép lambda được biên dịch byte, trong khi hai phần tử kia không (và tương đương). Lưu ý: điều này không có nghĩa là function thực sự byte biên dịch lambda.

Làm cách nào để tìm ra điều đó? Một chút nội dung của Emacs lisp cung cấp một số manh mối. Để bắt đầu: C-h hàm f RET:

chức năng là một hình thức đặc biệt trong 'C mã nguồn.

(chức năng arg)

Giống như 'quote', nhưng ưa thích dành cho đối tượng đó là chức năng. Trong byte biên dịch, 'hàm' gây ra đối số của nó để được biên dịch. 'quote' không thể làm điều đó.

Ok, vì vậy đó là sự khác biệt giữa (function (lambda ...))'(lambda ...), là người đầu tiên nói với trình biên dịch byte nó một cách an toàn có thể biên dịch biểu thức. Trong khi ' biểu ed có thể không nhất thiết phải được biên dịch (đối với họ chỉ có thể là một danh sách các số

gì về chỉ là trần (lambda ...)Ch f lambda RET chương trình:.?

lambda là macro Lisp trong `subr.el'.

(args lambda [docstring] [tương tác] cơ thể)

Return một lambda expression. một cuộc gọi của biểu mẫu (lambda args docstring nội dung tương tác) là tự trích dẫn; kết quả của việc đánh giá biểu thức lambda là biểu thức chính nó. Biểu thức lambda có thể sau đó được coi là một chức năng, ví dụ, lưu trữ như giá trị chức năng của một biểu tượng, thông qua để 'funcall' hoặc 'mapcar', vv

Do đó, (lambda ...)'(lambda ...) là tương đương.

Ngoài ra, có ký hiệu là #'(lambda ...), là đường cú pháp cho (function (lambda ...)).

Để biết thêm thông tin về các chức năng trong Emacs lisp, hãy đọc Functions info pages.

Chỉ cần để kiểm tra tất cả điều này, bạn có thể gõ như sau vào * cào * đệm và đánh giá các biểu thức:

(caddr '(lambda (x) (+ x x))) 
(+ x x) 

(caddr (lambda (x) (+ x x))) 
(+ x x) 

(caddr (function (lambda (x) (+ x x)))) 
(+ x x) 

(equal '(lambda (x) (+ x x)) 
     (function (lambda (x) (+ x x)))) 
t 

(equal '(lambda (x) (+ x x)) 
     (lambda (x) (+ x x))) 
t 

Vì vậy, cả ba biến thể của việc sử dụng lambda chỉ xây dựng danh sách có thể được sử dụng như chức năng (một trong số đó có thể được biên dịch byte).

+0

Nhưng không sử dụng một trích dẫn đơn ở phía trước của một biểu thức làm cho trình thông dịch LISP trả về giá trị đó và không đánh giá nó? Điều đó có nghĩa là, '(+ 1 2) sẽ trở lại là (+ 1 2) và (+ 1 2) sẽ trả lại là 3 ... – Joscha

+0

@ Joscha, không chắc chắn phần nào bạn đang nhận xét. Lambda là tự trích dẫn, điều đó chỉ có nghĩa là khi người phiên dịch đánh giá một biểu thức lambda, kết quả là cùng một biểu thức lambda. Tôi tin rằng điều này là khác với hầu hết các lisps khác vì tra cứu biến được sử dụng bởi Emacs (phạm vi vô hạn và mức độ động). Đề án tạo ra ít đóng cửa với một số thông tin môi trường vì mức độ từ vựng (tôi tin). –

+2

'(lambda ...)' thực sự là tương đương với '(hàm (lambda ...))' không '(lambda ...)' như bạn có thể thử bằng cách đánh giá '(macroexpand (lambda (x) (+ xx))) ' – nschum

3

Vâng (quote (lambda...))(lambda...) không tương đương (khi biên dịch byte). Các lambdas được trích dẫn không phải là byte được biên dịch trong khi mọi thứ khác là byte.

Ví dụ:

(defun foo (a) 
    (byte-code-function-p a)) 

(defun bar() 
    (foo '(lambda() (ignore 'me)))) 

(defun bar2() 
    (foo (lambda() (ignore 'me)))) 

(defun bar3() 
    (foo (function (lambda() (ignore 'me))))) 

(defun bar4() 
    (foo #'(lambda() (ignore 'me)))) 

(byte-compile 'bar) 
(byte-compile 'bar2) 
(byte-compile 'bar3) 
(byte-compile 'bar4) 

(bar) ; -> nil 

(bar2) ; -> t 
(bar3) ; -> t 
(bar4) ; -> t 

Bạn thường không muốn trích dẫn một lambda trừ khi chức năng bạn sẽ vượt qua lambda để được làm điều gì đó khác với nó hơn là chỉ funcall nó.

+1

Tôi tin rằng điều này đã thay đổi theo thời gian. Nhìn vào '(thông tin" (elisp) Anonymous Chức năng ")', nó nói "Ngày nay có thể bỏ qua 'chức năng' hoàn toàn ... Điều này là do 'lambda' chính nó ngụ ý 'chức năng'." Trang đó hơi khó hiểu khi đọc lần đầu, nhưng ví dụ của bạn giúp làm rõ rõ :) (a) '(hàm (lambda ...))' là một biến thể của '(trích dẫn (lambda ...)) 'cho phép biên dịch byte. (b) * un * -quoted '(lambda ...)' là (ngày nay) giống như '(hàm (lambda ...))'! – phils

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