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))))