Giả sử tôi muốn kích hoạt macro lược đồ trên một thứ khác ngoài mục đầu tiên trong biểu thức s. Ví dụ, giả sử rằng tôi muốn thay thế define
với một trung tố kiểu :=
, do đó:Macro lược đồ được kích hoạt bởi từ khóa không phải là đầu của danh sách
(a := 5) -> (define a 5)
((square x) := (* x x)) -> (define (square x) (* x x))
Việc chuyển đổi thực tế có vẻ là khá đơn giản. Bí quyết sẽ nhận được Đề án để tìm các biểu thức :=
và mở rộng macro. Tôi đã suy nghĩ về xung quanh phần lớn mã sử dụng cú pháp infix với macro chuẩn, có thể: (with-infix-define expr1 expr2 ...)
và có macro tiêu chuẩn đi qua các biểu thức trong phần nội dung của nó và thực hiện bất kỳ biến đổi cần thiết nào. Tôi biết rằng nếu tôi thực hiện phương pháp này, tôi sẽ phải cẩn thận để tránh việc chuyển đổi danh sách thực sự được coi là dữ liệu, chẳng hạn như danh sách được trích dẫn và một số phần nhất định của danh sách được phân phối. Một ví dụ về những gì tôi hình dung:
(with-infix-define
((make-adder n) := (lambda (m) (+ n m)))
((foo) :=
(add-3 := (make-adder 3))
(add-6 := (make-adder 6))
(let ((a 5) (b 6))
(+ (add-3 a) (add-6 b))))
(display (foo))
(display '(This := should not be transformed))
Vì vậy, câu hỏi của tôi là hai lần:
- Nếu tôi đi theo con đường
with-infix-define
, tôi phải xem ra cho bất kỳ trở ngại khác ngoài báo giá và quasiquote? - Tôi cảm thấy hơi giống như tôi đang sáng tạo lại bánh xe. Loại mã đi bộ này có vẻ như chính xác hệ thống mở rộng macro chuẩn nào phải làm - sự khác biệt duy nhất là chúng chỉ xem mục đầu tiên trong danh sách khi quyết định có thực hiện bất kỳ chuyển đổi mã nào hay không. Có cách nào tôi có thể chỉ piggyback trên hệ thống hiện tại?
Có gói chương trình mã dành cho người đi bộ không? Dường như tất cả những gì bạn cần làm là quấn mã trong một macro có, đi bộ mã đó và hoán đổi: = với s-exp trước đó, sau đó xác định macro biểu tượng mà làm cho: = tương đương với xác định. Tuy nhiên, không chắc chắn về mặc định s-exps. –