什么阻止像C这样的语言使用Lisp宏?在编译过程的什么时候,C放弃了操纵其代码树的能力?
而且,这是一个具体的解释与编译问题吗?
解决方法
语法问题
是的,你可以在命令式语言中使用类似Lisp的宏,因为Lisp支持命令式编程. C和Lisp中宏的主要区别在于操作源树是多么容易:
>在C中,有声明,声明符,语句,表达式,块,一些不同的控制结构,标签等.新的语法结构可能需要更改解析器.宏将需要构建这些数据结构.
>在Lisp中,只有s表达式.新的语法结构不需要更改解析器.只有一个数据结构意味着用于构造语法树的API非常简单且易于记忆.
有些语言具有更复杂的语法(如C),但它们具有强大的宏功能(如Lisp).例如,Haskell.但是,在Haskell中编写宏的接口有点复杂,因为您需要用于创建和应用类型构造函数,声明,表达式等的函数,而不仅仅是列表的单个构造函数.
Haskell中宏中的模板的类型有注释:
[e| ... |] -- expression [d| ... |] -- declaration [t| ... |] -- type [p| ... |] -- pattern
相比之下,Lisp宏中不需要那些字母e,d,t和p.这些在Haskell中是必需的,不是因为Haskell是强类型的,而是因为注释将解析器置于正确的状态,因此它可以使用适当的上下文解析内容.同样,Lisp语法只有一个上下文.
解释与编译
大多数语言可以同时解释,编译或同时解释. C可以是其中之一或两者. Lisp可以是其中之一或两者.宏需要编译器在编译时执行代码,这可以通过解释宏代码,或者通过编译宏然后执行它来完成.因此,解释与编译实际上并不是一个问题(在几乎所有关于语言的讨论中都不是问题).