2012-10-16 25 views

Trả lời

12

Trong những Lisps, có không gian tên duy nhất cho các biến và chức năng, biểu thức của bạn là hợp lệ. Chúng được gọi là Lisp-1. Đề án và Clojure là những ví dụ về Lisps như vậy.

Trong những Lisps đó, có các không gian tên riêng cho các biến và hàm, biểu thức của bạn sẽ là (funcall (f 2) 3 4). Chúng được gọi là Lisp-2. Lisp và Emacs Lisp thường là những ví dụ về Lisps như vậy.

Trong Lisp-2, mỗi biểu tượng có một khe giá trị và một khe chức năng . Để gọi hàm, được lưu trữ trong một khe giá trị bạn cần sử dụng funcall keyword.

Xem thêm về vấn đề này: http://www.dreamsongs.com/Separation.html

Edit: Nhờ Rainer Joswig tôi sửa câu trả lời.

+0

dụ bây giờ là ổn. Lời giải thích không thực sự. Khe cắm biểu tượng chỉ là một nửa của vấn đề. 'Lisp-2' có hai không gian tên. Giá trị không được lưu trữ trong các vị trí. Giá trị là kết quả của việc đánh giá các biểu thức. (let ((a (lambda() 'hi))) (funcall a)) Trong ví dụ này trong Common Lisp không có' symbol value 'có liên quan. Nó là một tra cứu của một biến từ vựng. Nó không phải là một truy cập vào một giá trị của một biểu tượng. Biểu tượng chỉ là một tạo phẩm của mã nguồn, nhưng không phải là thực thi thực tế. –

+0

Tôi nghĩ bạn nên viết lại đoạn thứ hai của bạn một chút. Có lẽ bắt đầu với "Trong Lisp-2s, mặt khác, có những không gian tên riêng biệt ..." Lúc đầu tôi bối rối vì tôi nghĩ bạn vẫn đang nói về Lisp-1 trong đoạn thứ hai của bạn. Tuy nhiên, được chấp nhận. – spacingissue

5

Ví dụ trong Common Lisp ở trên không hợp lệ. Cú pháp của Common Lisp thường không cho phép các danh sách là người đứng đầu của một cuộc gọi hàm. Bạn phải sử dụng FUNCALL để gọi giá trị hàm trả lại.

(funcall (f 2) 3 4) 

Trong một số phương ngữ Lisp khác, nó được cho phép. Đề án là một phương ngữ Lisp. Sơ đồ cũng đánh giá phần đầu của biểu thức cuộc gọi hàm.

+1

Tôi ước tôi có thể chấp nhận nhiều câu trả lời. Cảm ơn bạn! – spacingissue

1

Lisp-1 lisps, chẳng hạn như Lược đồ, thường có tất cả các biểu thức của một dạng hàm được đánh giá, ngay cả chính hàm đó.

Lisp-2 lisps, chẳng hạn như Common Lisp, thường có hành vi khác nhau đối với hàm và đối số. Trong khi các đối số được đánh giá, hàm được tra cứu. Cách phổ biến để gọi hàm được đánh giá là sử dụng funcall hoặc apply.

(funcall (f 2) 3 4) 

Trong Common Lisp, bạn có thể sử dụng một lambda form, nếu bạn nhấn mạnh vào việc đánh giá cái gì đó để một chức năng trong điều hành:

((lambda (&rest args) (apply (f 2) args)) 3 4)