Scheme 如何匹配球拍中的构造模式?

Scheme 如何匹配球拍中的构造模式?,scheme,racket,quote,Scheme,Racket,Quote,我知道我们可以使用球拍中的quasikote模式进行模式匹配。例如: > (match '(3) [`(,l) l]) 3 但是,我不确定是否有可能用预先存在的模式实现相同的结果,比如 > (define pattern '`(,l)) > pattern '`(,l) 如何将这种模式注入匹配子句?匹配是一个宏。它在运行时之前使用代码中的参数,从而使用模式。如果您检查宏步进器(match'(3)[`(,l)l])将变为: (let ([temp1 '(3)]) (de

我知道我们可以使用球拍中的
quasikote
模式进行模式匹配。例如:

> (match '(3) [`(,l) l])
3
但是,我不确定是否有可能用预先存在的模式实现相同的结果,比如

> (define pattern '`(,l))
> pattern
'`(,l)

如何将这种
模式
注入
匹配
子句?

匹配
是一个宏。它在运行时之前使用代码中的参数,从而使用模式。如果您检查宏步进器
(match'(3)[`(,l)l])
将变为:

(let ([temp1 '(3)])
  (define (fail2) 
    (match:error temp1 (syntax-srclocs (quote-syntax srcloc)) 'match))
  (cond
   [(pair? temp1)
    (let ([unsafe-car4 (unsafe-car temp1)] [unsafe-cdr5 (unsafe-cdr temp1)])
      (cond
       [(null? unsafe-cdr5)
        (syntax-parameterize
         ([fail (make-rename-transformer (quote-syntax fail2))])
         (let ([l unsafe-car4]) (let () l)))]
       [else (fail2)]))]
   [else (fail2)]))
如果使用变量
pattern
代替
`(,1)
,它只会认为您有一个匹配整个参数的模式。如扩展的
(匹配“(3)[模式l])
所示:

您的变量
模式
在这种情况发生后不久就不存在了,因此
匹配
不能采用动态模式。如果原因是您想对许多模式进行抽象,但这些模式在没有输入的情况下仍然是可计算的,则需要将模式逻辑移到宏扩展时间

如果需要输入模式,则不能以这种方式使用
match
。也许您需要在运行时做一些类似的事情


因为这个例子很基本,我不知道你想达到什么目的。我想这可能是一个好消息

虽然我不确定你到底想完成什么,但我想指出,你可以定义。请记住,与match一样,它们存在于编译时,而不是运行时。

是的,对我来说也是XY问题。可能它们想要定义一个匹配扩展器??如果是:
(let ([temp1 '(3)])
  (define (fail2) 
    (match:error temp1 (syntax-srclocs (quote-syntax srcloc)) 'match))
  (syntax-parameterize ([fail (make-rename-transformer (quote-syntax fail2))])
    (let ([pattern temp1]) (let () l))))