2016-07-25 21 views
5

Tôi thường sử dụng cấu trúc phù hợp với mẫu củavà tôi đã nghĩ cách tự sửa lỗi chương trình bằng cách sử dụng match và tìm hiểu cách macro Racket/Scheme hoạt động. thông tin giống như mẫu nào được khớp.Số tăng dần trong Định nghĩa Macro

Nói cách khác, tôi đang tìm cách để tạo ra một macro, đưa ra này:

(match/debug 'two 
    ['one 1] 
    ['two 2]) 

Đầu ra một cái gì đó như thế này:

Case 2 <-- Printed 
2  <-- Returned value 

Trở ngại chính cho đến nay đã cố gắng để có được các con số biểu thị trường hợp được giải quyết để hiển thị chính xác.

mục tiêu của tôi là cố gắng viết một cái gì đó mà sẽ mở rộng như thế này:

(match 'two 
    ['one (displayln "Case 1") 1] 
    ['two (displayln "Case 2") 2]) 

Nhưng tôi đã không thể tìm ra cách nào để tạo ra những "Case #" chuỗi.

Dưới đây là định nghĩa cố vĩ mô của tôi:

(define-syntax-rule (match/debug id [pattern value] ...) 
    (let ([index 0]) 
    (match id 
     [(begin 
     (set! index (add1 index)) 
     pattern) 
     (printf "Case ~a\n" index) 
     value] ...))) 

Có vẻ như cú pháp của match sẽ không cho phép tôi làm điều gì đó như thế này, nhưng đây là cách duy nhất tôi có thể nghĩ đến. Tôi chỉ thực sự quen với kiểu macro của Common Lisp.

Trả lời

5

Đây là giải pháp.

Chức năng trợ giúp clauses->numbers trả về danh sách các số từ 0 đến số ít hơn số mệnh đề. Điều này sau đó được sử dụng để cung cấp cho mỗi mệnh đề số riêng của nó. Lưu ý rằng giải pháp này tính từ 0 (và không 1 như trong ví dụ của bạn).

#lang racket 
(require (for-syntax syntax/parse)) 

(begin-for-syntax 
    (require racket/list) ; import range 
    (define (clauses->numbers stx) 
    (range (length (syntax->list stx))))) 

(define-syntax (match/debug stx) 
    (syntax-parse stx 
    [(_match/debug id [pattern value] ...) 
    (with-syntax ([(n ...) (clauses->numbers #'([pattern value] ...))]) 
     (syntax/loc stx 
     (match id 
      [pattern (begin (displayln (~a "Case: " n)) value)] 
      ...)))])) 

(match/debug 'one 
    ['one 1] 
    ['two 2]) 

(match/debug 'two 
    ['one 1] 
    ['two 2]) 

Sản lượng:

Case: 0 
1 
Case: 1 
2 
+0

Funnily đủ ... Tôi thực sự đã kết thúc bằng cách sử dụng mô hình trích dẫn, nó đã cho tôi đủ thông tin. Nhưng cảm ơn vì phản ứng nhanh chóng và kỹ lưỡng! – mellowmaroon

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