是否有可能将类似Lisp的宏构建为命令式语言?

sda*_*das 8 c lisp compiler-construction macros language-design

什么阻止像C这样的语言使用Lisp宏?在编译过程中的什么时候,C放弃了操纵其代码树的能力?

而且,这是一个特别是解释与编译的问题吗?

Die*_*Epp 16

语法问题

是的,你可以在命令式语言中使用类似Lisp的宏,因为Lisp支持命令式编程.C和Lisp中宏的主要区别在于操作源树是多么容易:

  • 在C中,有声明,声明符,语句,表达式,块,一些不同的控制结构,标签等.新的语法结构可能需要更改解析器.宏将需要构建这些数据结构.

  • 在Lisp中,只有s表达式.新的语法结构不需要更改解析器.只有一个数据结构意味着用于构造语法树的API非常简单且易于记忆.

有些语言具有更复杂的语法(如C),但它们具有强大的宏功能(如Lisp).例如,Haskell.但是,在Haskell中编写宏的接口有点复杂,因为您需要用于创建和应用类型构造函数,表达式,声明,表达式等的函数,而不仅仅是列表的单个构造函数.

Haskell中宏中的模板的类型有注释:

[e| ... |] -- expression
[d| ... |] -- declaration
[t| ... |] -- type
[p| ... |] -- pattern
Run Code Online (Sandbox Code Playgroud)

相比之下,那些信件e,d,t,并且p不需要在Lisp的宏.这些在Haskell中是必需的,不是因为Haskell是强类型的,而是因为注释将解析器置于正确的状态,因此它可以使用适当的上下文解析内容.同样,Lisp语法只有一个上下文.

解释与编译

大多数语言可以同时解释,编译或同时解释.C可以是其中之一或两者.Lisp可以是​​其中之一或两者.宏需要编译器在编译时执行代码,这可以通过解释宏代码,或者通过编译宏然后执行它来完成.所以解释与编译实际上是一个非问题(在几乎所有关于语言的讨论中都不是问题).