(define-sytax foo
()
(syntax-rules
((foo a b) (+ (car a) b))
))
(foo '(1 2 3) 3)
;; a -> '(1 2 3)
;; b -> 3
这是一个很简单的模型。
pattern (foo a b)可以用来生成一个parser,方法如下
parser_syntax_foo = do或者可以封装在Monad中:
parser_left_par
parser_foo
a <- parser_a -- :: Parser Binding
b <- parser_b -- :: Parser Binding
parser_right_par
return $ a ++ b
-- Binding: 用来描述宏替换时宏参数和替换文本之间对应关系
parser_syntax_foo = dotemplate (+ (car a) b))
parser_left_par
parser_foo
parser_a -- :: Parser ()
parser_b -- :: Parser ()
parser_right_par
...
用前面得到的参数对应的替换文本进行替换
...
genCode template
...
其中genCode :: Template -> Parser Expr
Binding已经封装在Monad中
pattern可以生成一个parser的表([Parser ()])用mapM_来跑一遍
于是可以写成
在顶层的Parser里封装了一个宏函数(foo)和对应的Parser之间的绑定关系。
parser_syntax_foo :: Pattern -> Template -> Parser Expr
parser_syntax_foo pattern template = do
mapM_ (genParsers pattern)
genCode template
Parser根据实际遇到的调用进行分派
没有评论:
发表评论