Tôi đã thấy một câu trả lời của How does Lisp let you redefine the language itself? Stack Overflow hỏi (trả lời bằng cách Noah Lavine):Có các macro biến đổi toàn bộ chương trình trong Lisp hoặc Lược đồ không?
Macro là không hoàn toàn một định nghĩa đầy đủ về ngôn ngữ, ít nhất là như xa như tôi biết (tôi' m thực sự là một Schemer, tôi có thể sai), bởi vì có một hạn chế. Macro chỉ có thể lấy một mã con duy nhất của mã của bạn và tạo một cây con duy nhất để thay thế nó. Vì vậy, bạn không thể viết các macro toàn bộ chương trình chuyển đổi, như là mát mẻ như vậy sẽ được.
Sau khi đọc, tôi tò mò muốn biết có "macro toàn bộ chương trình chuyển đổi" trong Lisp hoặc lược đồ (hoặc một số ngôn ngữ khác) hay không.
Nếu không thì tại sao?
- Nó không hữu ích và không bao giờ yêu cầu?
- Điều tương tự có thể đạt được bằng một số cách khác?
- Không thể triển khai ngay cả trong Lisp?
- Có thể, nhưng chưa được thử hoặc triển khai chưa?
Cập nhật
Một loại trường hợp sử dụng ví dụ
Như trong mã stumpwm đây là một số chức năng tất cả trong file nguồn lisp khác nhau sử dụng một động/toàn cầu defvar biến * màn hình-list * được xác định trong primitives.lisp, nhưng được sử dụng trong màn hình. lisp, user.lisp, window.lisp. (Ở đây mỗi file có chức năng, lớp, VAR liên quan đến một khía cạnh hoặc đối tượng)
Bây giờ tôi muốn xác định các chức năng theo việc đóng cửa nơi * màn hình-list * biến sẵn bằng hình thức let, nó không nên là biến động/toàn cục, nhưng không di chuyển tất cả các chức năng này vào một nơi (vì tôi không muốn các chức năng này bị mất từ tập tin liên quan ) Do đó biến này sẽ chỉ có thể truy cập được vào các chức năng này.
Phía trên ví dụ: áp dụng như nhau cho nhãn và flet, do đó, nó sẽ tiếp tục có thể mà chúng tôi có thể làm cho nó như thế chỉ cần thay đổi, chức năng sẽ có sẵn, cho những người yêu cầu nó.
Lưu ý một cách có thể là triển khai và sử dụng một số macro defun_with_context để xác định nơi đối số đầu tiên là ngữ cảnh cho phép, biến flet xác định. Nhưng ngoài nó có thể đạt được bằng đầu đọc vĩ mô là Vatine và Gareth Rees trả lời.