2015-04-20 14 views
6

Tôi đang tìm kiếm (thế giới thực) sử dụng fexprs, nơi chúng được sử dụng theo cách khác với những gì có thể được thực hiện với đánh giá lười biếng.Ví dụ về sử dụng fexpr không tầm thường

Hầu hết các ví dụ mà tôi có thể tìm chỉ sử dụng fexprs để thực hiện đánh giá có điều kiện, như cho ngắn mạch "và" tác động (Đánh giá đối số đầu tiên, nếu sai, không đánh giá thứ hai và trả về false).

Tôi đang tìm kiếm "hữu ích" sử dụng, đó là nơi sử dụng fexpr dẫn đến mã "tốt hơn" (sạch hơn) so với những gì có thể được thực hiện mà không có fexprs.

+0

Bởi fexprs, bạn đang đề cập đến [macro] (http://vi.wikipedia.org/wiki/Macro_ (computer_science) #Lisp_macros) hoặc thực tế [fexprs] (http://en.wikipedia.org/ wiki/Fexpr)? Tôi hỏi vì phần lớn các macro sử dụng Lisps hiện đại thay vì fexprs. – malisper

+1

FEXPR chết trong dòng chính của Lisp vào những năm 80 và thay thế bằng các macro. Macro dành cho cú pháp trừu tượng. Với việc đánh giá lười biếng tất cả các biểu mẫu đặc biệt có thể là các hàm do đó bạn có thể thực hiện cú pháp với các hàm do việc đánh giá không xảy ra cho đến khi bạn cần một cái gì đó được tính toán. Thông thường đây là những ngôn ngữ khác nhau vì vậy tôi không thấy làm thế nào hai được so sánh khi họ có lẽ không bao giờ gặp nhau trong một ngôn ngữ. – Sylwester

+0

@malisper Có, tôi đang đề cập đến fexprs thực tế hoặc "gọi theo văn bản" nếu bạn muốn. –

Trả lời

2

Có hai lý do chính bạn muốn sử dụng fexprs.

Điều đầu tiên là vì chúng cho phép bạn đánh giá các đối số một số lần tùy ý. Điều này làm cho nó có thể thực hiện các toán tử đánh giá các đối số của chúng một cách uể oải như bạn đã gợi ý. Xây dựng được xây dựng theo cách này cũng có khả năng đánh giá đối số của họ nhiều hơn một lần. Điều này làm cho nó có thể thực hiện các vòng thông qua fexprs!

Trường hợp khác là để chuyển đổi. Chuyển đổi mã về cơ bản là một cách viết một trình biên dịch trên đầu trang của Lisp hiện tại của bạn. Mặc dù nó sử dụng macro và không phải fexprs, cl-who là một ví dụ tuyệt vời về loại biến đổi có thể được thực hiện.

1

Fexpr có phần trực giao để đánh giá lười biếng/háo hức.

Cách tiếp cận chức năng thông thường là đánh giá các đối số cho một hàm rồi gọi nó trên kết quả. Lazy eval vẫn hoạt động như thế này, nó chỉ trì hoãn việc đánh giá cho đến khi ngay lập tức trước khi tham số được sử dụng.

Cách tiếp cận macro thông thường là chuyển các đối số chưa được định giá vào mẫu đánh giá bất kỳ thứ gì không được trích dẫn. Các mảnh kết quả của AST được tiêm vào trang web cuộc gọi, nơi nó thường được đánh giá một lần nữa. Điều này làm việc nhiều như vậy với eval lười biếng.

Phương pháp tiếp cận fexpr điên rồ trong lịch sử là chuyển các đối số không được đánh giá đến hàm, điều này làm thỏa mãn chúng. Kết quả được tiêm trực tiếp vào trang cuộc gọi và thường không được đánh giá tự động.

Fexpr là khá gần với một biến đổi tùy ý. Vì vậy, bạn có thể triển khai các macro và lambdas với chúng. Bạn cũng có thể thực hiện bất cứ điều gì lai của mong muốn/lười biếng đánh giá bạn muốn. Tương tự như vậy, bạn có thể thực hiện fexpr mặc định cho các eval lười biếng và các lời gọi rõ ràng đến eval() ở nhiều nơi khác nhau để buộc hành vi háo hức.

Tôi không nghĩ rằng tôi sẽ mô tả fexpr như là một giải pháp dễ dàng để thực hiện eval lười biếng mặc dù, trong một chữa bệnh là tồi tệ hơn ý nghĩa bệnh tật.

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