2013-06-07 23 views

Trả lời

10

Macro Lisp phổ biến là các thay thế mã, chúng xảy ra ở "thời gian mở rộng macro". Đối với mã được giải thích, số này có thể là "thời gian chạy". Đối với mã được biên dịch, nó hầu như luôn luôn trong "thời gian biên dịch".

Khi mã đã được thay thế, không có tham chiếu đến macro trong mã được biên dịch kết quả (nguồn gốc trên đĩa vẫn có điều này, nếu sử dụng macro đã được lưu vào tệp).

Mặc dù sẽ có một số tiện ích trong hệ thống lisp đã lưu tất cả các phần tử "mở rộng trước macro" và theo dõi những macro nào đã được sử dụng và tự động biên dịch lại bất kỳ thứ gì sử dụng macro cụ thể (có thể đệ quy) , đã bị loại khỏi tiêu chuẩn.

Thông thường, tôi viết các macro tiện ích của mình khá sớm để phát triển, vì vậy, tôi không cần nhiều chức năng này và tôi hạnh phúc hơn nếu không có nó. chạy kích thước hình ảnh khá một chút, không cần phải theo dõi tất cả điều đó).

8

Lưu ý rằng nó có thể là cần thiết.

Lý do là các macro trong triển khai được biên dịch chỉ được mở rộng một lần tại thời gian biên dịch và chính macro không có trong mã được tạo.

Để được rõ ràng hơn xem xét

(defmacro badsquare (x) 
    `(* ,x ,x)) 

(defun f (x) 
    (badsquare (+ x 3)) 

khi trình biên dịch phân tích f mã sẽ mở rộng nó để

(defun f (x) 
    (* (+ x 3) (+ x 3))) 

và các tham chiếu đến các badsquare vĩ mô không nhất thiết phải trình bày nữa vì vậy nếu bạn xác định lại các badsquare vĩ mô cho cái gì khác này sẽ không có hiệu lực trên f trừ khi bạn cũng biên dịch lại nó.

3

biên dịch lại những ứng dụng của một vĩ mô mà đã thay đổi chỉ cần thiết khi:

  • vĩ mô cũ đã có một lỗi. Những gì nó có nghĩa là cho một macro có lỗi là nó tạo ra mã xấu. Mã xấu phải được tạo lại bằng macro cố định.

  • Mã sucky cũ được tạo ra. Chúng tôi muốn biên dịch lại mã bằng macro mới nhất và vĩ đại nhất tạo mã đẹp nhất.

  • Hỗ trợ thời gian chạy cho macro cũ sẽ biến mất. Mã macro được tạo cũ giúp thực hiện các cuộc gọi đến các chức năng hỗ trợ thời gian chạy đặc biệt cũng được cung cấp bởi gói. Một số chức năng đó sẽ biến mất trong phiên bản mới của gói macro hoặc đang thay đổi theo các cách không tương thích ngược.Vì vậy, khi các chức năng mới được cài đặt, mã đã biên dịch hiện tại sẽ không hoạt động chính xác. Corrolary: Khi duy trì các gói macro có hỗ trợ thời gian chạy, hãy nhớ mã có thể không được biên dịch lại và có kế hoạch duy trì khả năng tương thích và áp đặt lỗi thời.

  • Nhất quán. Bạn đã sửa đổi nhiều macro nhiều lần, nhưng bạn đã biên dịch lại chỉ một số hàm hoặc tệp nguồn tùy thuộc vào macro, trong khi bỏ qua các macro khác. Do đó, bạn đang thử nghiệm hình ảnh "quái vật Frankenstein" chứa macro mở rộng không thể được xây dựng lại từ mã nguồn. Và bất kỳ thử nghiệm nào bạn đang thực hiện chỉ hợp lệ cho hình ảnh đó. Khi mọi thứ xảy ra, nó có thể chỉ là do sự mâu thuẫn, và vì vậy bạn lãng phí thời gian để theo đuổi các lỗi không tồn tại. Hoặc ngược lại: một cái gì đó hoạt động đúng, nhưng chỉ vì sự kết hợp của mã cũ và tươi. Bạn muốn xây dựng lại mọi thứ từ đầu để bạn có một đường cơ sở được xác định rõ ràng để kiểm tra phần mềm hoặc đóng gói bản phát hành.

  • Thay đổi giao diện. Cú pháp của macro đã thay đổi và do đó mã phải được cập nhật để sử dụng macro mới. Mặc dù có thể mã nhị phân cũ được mở rộng bằng macro cũ có thể tiếp tục được sử dụng, sau đó bạn có tình huống chạy các tệp nhị phân cũ về mã nguồn được cập nhật (đưa chúng ta trở lại điểm thống nhất trước đó).

Nếu không có điều kiện nào trong số các điều kiện này được áp dụng, thì chúng tôi có thể cho phép bản thân được lười trong việc biên dịch lại mã phụ thuộc vào macro.