2015-12-03 2 views
0

Я пытаюсь использовать match на шаблоне ввода пользователя, вместо того, чтобы статическим.Соответствие по шаблону ввода пользователя

Идея заключается в том, чтобы расширить:

(rule-match '(a (or '< '=) b) '(list a b) '(3 < 4)) 

Для

(match '(3 < 5) [(list a (or '< '=) b) (list a b)]) 

Я не очень хорошо знакомы с макро и попытался следующее:

(define-syntax (rule-match stx) 
    (syntax-case stx() 
    [(_ pat act input) 
    (with-syntax ([pattern-syntax (syntax (cons 'list pat))] 
        [action-syntax (syntax act)]) 
     #'(match input [pattern-syntax action-syntax]))])) 

Но получаю ошибку match: no matching clause for '(3 < 4)

У кого-нибудь есть намек на это?

ответ

1

Вы близко. Однако цитата, прилагаемая к вашему шаблону, будет делать странные вещи. Вместо этого просто поместите list в шаблон. Вот отрывок, который делает то, что я думаю, что вы хотите:

#lang racket 

(define-syntax (rule-match stx) 
    (syntax-case stx() 
    [(_ pat act input) 
    (with-syntax ([pattern-syntax (syntax pat)] 
        [action-syntax (syntax act)]) 
     #'(match input [pattern-syntax action-syntax]))])) 

(rule-match (list a (or '< '=) b) (list a b) '(3 < 4)) 

В самом деле, на данный момент, нет действительно никакой причины, чтобы отделить две синтаксические привязок, и вы можете просто упростить следующим образом:

#lang racket 

(define-syntax (rule-match stx) 
    (syntax-case stx() 
    [(_ pat act input) 
    #'(match input [pat act])])) 

(rule-match (list a (or '< '=) b) (list a b) '(3 < 4)) 

... который, я думаю, вы согласитесь, легче читать.

+0

Спасибо за ответ, но мне нужен прецедент, в котором вы должны передать переменную функции '(правильное совпадение с некоторым-var-pattern-некоторым-var-action-вводом), которое, я думаю, не сработает с этим реализация. – mathk

+0

erm ... передать переменную? Можете ли вы рассказать о своем примере, чтобы показать, что вы имеете в виду? –

+0

Ах! вы хотите, чтобы пользователь мог передавать шаблоны в виде значений времени выполнения? Похоже, вы должны просто написать свой собственный шаблон-матчер для этого. В частности, вы будете заниматься вопросами гигиены; если вы разрешаете пользователю проходить произвольные шаблоны и шаблоны, очевидная реализация не сможет отслеживать гигиену. –