Các ứng dụng điển hình của macro Lisp là gì?


19

Tôi đang cố gắng học một số LISP và tôi đã đọc rất nhiều về tầm quan trọng của các macro LISP vì vậy tôi muốn có được một số kinh nghiệm làm việc với chúng.

Bạn có thể đề xuất một lĩnh vực ứng dụng thực tế cho phép tôi sử dụng macro để giải quyết vấn đề trong thế giới thực và để hiểu được tính hữu ích của cấu trúc lập trình này không?

CHÚ THÍCH

Đây không phải là một dự án chung chung tôi nên làm gì câu hỏi tiếp theo . Tôi quan tâm để hiểu loại vấn đề nào thường được giải quyết bằng các macro LISP. Ví dụ, chúng có tốt cho việc thực hiện các kiểu dữ liệu trừu tượng không? Tại sao cấu trúc này được thêm vào ngôn ngữ? Những loại vấn đề nào nó giải quyết mà không thể giải quyết bằng các chức năng đơn giản?


Câu trả lời:


9

Macro Lisp kết hợp một vài thuộc tính riêng biệt:

  1. Macro xác định cú pháp mới họ sử dụng mã nguồn làm đầu vào
  2. Macro thường được chạy ở thời gian biên dịch
  3. Macro tạo mã nguồn

Các ứng dụng tốt nhất sử dụng tất cả các khía cạnh đó. Có lẽ ví dụ được biết đến nhiều nhất là (vòng lặp) trong Common Lisp, nó sẽ không ở đâu gần với tính hữu dụng của nó nếu không có một trong những tính năng đó. Không có nguồn làm đầu vào, sẽ rất khó để xác định các hành động bên trong vòng lặp; nếu không mở rộng thời gian biên dịch thì nó sẽ quá chậm; và không có mã tạo, nó sẽ không được thực thi.

Một ví dụ điển hình khác là chương tuần tự nhị phân trong Thực tế chung Lisp , Thực tế: Phân tích tệp nhị phân .

Một macro truy vấn thực hiện một cái gì đó tương tự như LINQ có thể là một ứng dụng tốt khác. Nhưng nó sẽ thiếu việc hoàn thành tự động làm cho LINQ tốt như nó vốn có. Hầu như mọi thứ ngày nay được giải quyết bằng các trình tạo mã mục đích đặc biệt với các đầu vào XML (ví dụ XAML) cũng có thể được thực hiện bằng cách sử dụng macro Lisp.


Tôi vừa mua cuốn sách "Thực tế chung Lisp", tôi sẽ xem xét ví dụ mà bạn đã đề xuất.
Giorgio

2

Cách tôi muốn nghĩ về các macro trong lisp phổ biến là chúng là các hàm trả về mã được đánh giá, nhưng 'không' đánh giá các đối số của chúng trước khi trả lại mã đó. Các hàm cũng trả về một cái gì đó, nhưng chúng đánh giá từng đối số trước khi cơ thể của chúng được đánh giá. Macro không.

Paul Graham trong 'On Lisp' cung cấp (IMHO) một trong những mô tả tốt nhất về sự khác biệt giữa các macro và chức năng, và thảo luận về sự chồng chéo và tính độc đáo của chúng. Nhiều bit mã có thể được viết dưới dạng hàm hoặc macro, nhưng có những trường hợp chỉ macro sẽ hoạt động. Khi bạn quấn đầu xung quanh điều này, tôi nghĩ rằng bạn đã có ý chính về macro.

Như một ví dụ về macro mà một chức năng sẽ không hoạt động, hãy xem 'aif' (anaphoric if). Đó chỉ là một vài dòng mã và khuyến nghị của tôi về nơi bắt đầu.

Và tham khảo phiên bản anaphoric chung của Lisp nếu, điều đó lợi dụng việc nắm bắt biến có chủ ý. Phiên bản tự động vệ sinh của sơ đồ không phải là IMO 'thỏa thuận thực sự'. Chụp biến là một phần quan trọng của vĩ mô học, và một số macro mạnh mẽ và hữu ích hơn chắc chắn tận dụng lợi thế của nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.