2007年2月21日星期三

define-syntax的实现

(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
parser_left_par
parser_foo
a <- parser_a -- :: Parser Binding
b <- parser_b -- :: Parser Binding
parser_right_par
return $ a ++ b
-- Binding: 用来描述宏替换时宏参数和替换文本之间对应关系
或者可以封装在Monad中:
parser_syntax_foo = do
parser_left_par
parser_foo
parser_a -- :: Parser ()
parser_b -- :: Parser ()
parser_right_par
...
template (+ (car a) b))
用前面得到的参数对应的替换文本进行替换
...
genCode template
...
其中genCode :: Template -> Parser Expr
Binding已经封装在Monad中

pattern可以生成一个parser的表([Parser ()])用mapM_来跑一遍
于是可以写成

parser_syntax_foo :: Pattern -> Template -> Parser Expr
parser_syntax_foo pattern template = do
mapM_ (genParsers pattern)
genCode template
在顶层的Parser里封装了一个宏函数(foo)和对应的Parser之间的绑定关系。
Parser根据实际遇到的调用进行分派

没有评论: