2011-11-03 33 views
7

Tuyến đường tốt nhất cho một lập trình viên có kinh nghiệm bắt buộc chỉ quen thuộc với các macro C để tìm hiểu hệ thống macro Vợt là gì. Không chỉ là cơ chế của nó (như thế nào?) Mà còn ở đâu và tại sao sử dụng nó và các ví dụ minh họa điều này.Cách tốt nhất để học hệ thống Vợt Macro cho các lập trình viên bắt buộc

Có nên tìm hiểu các lược đồ Scheme (hoặc Lisp) trước không? Tôi đã nghe nói rằng cuốn sách "On Lisp" có một lời giải thích tốt về các macro Lisp với các ví dụ tuyệt vời về việc sử dụng chúng. Điều này có hữu ích hay không?

+0

Câu hỏi này được hỏi 3 năm trước và có hai câu trả lời hay. Tôi không hiểu tại sao việc đặt "tạm dừng" lại hữu ích, đặc biệt là vì những người đặt nó "bị giữ" không có bất kỳ kinh nghiệm nào trong lĩnh vực này. –

+0

Đó là những gì tôi đã tự hỏi Sam :-) –

+0

Harry, bạn nên bỏ phiếu để mở lại câu hỏi này. –

Trả lời

6

Racket's documentationexcellent tutorial on using macros.

Tôi chắc chắn sẽ đề xuất các macro lược đồ trên các macro CL nếu bạn chưa xử lý bất kỳ loại macro Lisp nào trước đây. Đó là vì các macro của Lược đồ sử dụng đối sánh mẫu và dễ đọc hơn nhiều.

Ví dụ (sử dụng define-syntax-rule vợt của):

(define-syntax-rule (let ((var val) ...) 
         expr ...) 
    ((lambda (var ...) 
    expr ...) 
    val ...)) 

Đây là một macro rất đơn giản định nghĩa let về việc tạo ra một lambda tương ứng, sau đó áp dụng nó. Thật dễ dàng để đọc và dễ dàng giải thích về điều đó.

vĩ mô Hơi phức tạp hơn:

(define-syntax let* 
    (syntax-rules() 
    ((let*() 
     expr ...) 
    (let() 
     expr ...)) 
    ((let* ((var val) next ...) 
     expr ...) 
    (let ((var val)) 
     (let* (next ...) 
     expr ...))))) 

này định nghĩa let* về lồng let s, do đó các ràng buộc được thực hiện tuần tự. Nó bao gồm một trường hợp cơ sở (không có ràng buộc), cũng như một trường hợp đệ quy.

+0

Bạn có thể giới thiệu bất kỳ cuốn sách nào cho việc này không. –

+1

Không biết về sách, nhưng Racket có hướng dẫn tuyệt vời cho macro: http://docs.racket-lang.org/guide/macros.html –

+0

Bạn nên cập nhật câu trả lời với con trỏ này vì đây là câu trả lời trực tiếp hơn cho câu hỏi ban đầu ... –

12

Tôi tin rằng hướng dẫn tốt nhất về macro vẫn là số "Writing Hygenic macros in Scheme with syntax-case" của Kent Dybvig. Nó không phải là đặc biệt về Racket, nhưng về cơ bản mọi thứ sẽ tiếp tục, và đọc guide mà Chris đã đề cập ở trên sẽ bao gồm bất kỳ sự khác biệt còn lại. Mặc dù có tên, nó bao gồm cả các macro "hygenic" và "unhygenic".

Sửa tháng 7 năm 2014:

Kể từ khi tôi đã viết ở trên, Greg Hendershott đã viết một hướng dẫn tuyệt vời về macro trong vợt, quyền Fear of Macros. Đó là nơi tốt nhất để bắt đầu tìm hiểu về các macro Racket.

+2

+1 cho bài viết của Dybvig. Tôi đã thực sự đọc nó một thời gian trước đây và nó đã giúp tôi hiểu các macro 'cú pháp-case' rất nhiều, đặc biệt là những thứ như 'cú pháp' hoạt động như thế nào. –

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