2010-11-16 21 views
12

Đi chức năng này:Tại sao không có lỗi LISP yêu cầu báo giá trước đối số tham số của nó?

(defun sum-greater (x y z) 
(> (+ x y) z)) 

Đó là sự hiểu biết của tôi rằng trong LISP phần tử đầu tiên trong danh sách luôn thể hiện một chức năng được thực hiện trên các nguyên tử/danh sách tiếp theo. Vì vậy, tại sao LISP không xử lý x trong (x y z) làm chức năng được thực hiện trên yz. Rõ ràng đây không phải là hành vi mong muốn, nhưng nó sẽ là hành vi mong đợi.

Có lẽ chức năng xác định defun bằng cách nào đó sẽ ghi đè đánh giá LISP chuẩn của danh sách? Nếu vậy, bạn có thể nêu chi tiết điều này không?

Cảm ơn

+3

Nó cũng sẽ đánh giá tất cả các đối số khác của nó: bạn rõ ràng không muốn '(> ...)' đánh giá khi bạn đánh giá biểu mẫu 'defun'! – Ken

+0

Điểm tốt, tôi cần phải nhận ra defun là nhiều hơn một chức năng bình thường từ đó một mình .. –

Trả lời

8

IIRC trong Common Lisp ít nhất defun là một macro (HyperSpec), có nghĩa là nó có thể xác định bất kỳ chiến lược đánh giá nào cho lập luận của mình.

+1

Ah phải, có ý nghĩa. Tôi chưa đạt đến chương vĩ mô của cuốn sách LISP của tôi. FYI - đã chọn câu trả lời này vì nó ngắn gọn nhất, nhưng cảm ơn tất cả mọi người. –

3

Giả định của bạn là chính xác. Defun thường là một special form hoặc macro

+1

trong Emacs Lisp, nhưng không phải trong Common Lisp. Có nó là một vĩ mô. –

+2

Tôi đã chỉnh sửa câu trả lời trước nhận xét của bạn. Nhưng bạn đã khá chính xác. –

6

defun là đặc biệt vì nó là macro. Và kể từ khi macro có thể được thực hiện phụ thuộc, tất cả các loại ma thuật đen có thể xảy ra bên dưới mui xe.

Lisp HyperSpec (Common Lisp) says và tôi trích dẫn: "Không có đối số nào được đánh giá ở thời gian mở rộng macro".

3

Bạn có thể tải xuống tại đây phần giới thiệu cơ bản về Lisp:

Common Lisp: A Gentle Introduction to Symbolic Computation, by David S. Touretzky.

Lisp và đặc biệt là Common Lisp có nhiều hình thức Lisp:

  • chức năng gọi

  • cuộc gọi vĩ mô

  • hình thức đặc biệt

DEFUN là một macro. Do đó, macro xác định phần nào được đánh giá và phần nào không được đánh giá. Đối với ANSI Common Lisp, điều này được định nghĩa trong tiêu chuẩn và được thực hiện bởi macro DEFUN.

2

defun không phải là một chức năng, nhưng một dạng đặc biệt (hoặc nhỏ xuống một), và cho những cơ chế đánh giá này là khác nhau. Ví dụ tương tự sẽ là, nếu một trong các đối số thậm chí bị loại bỏ hoàn toàn mà không bị đánh giá chút nào!

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