微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

什么阻止像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可以是​​其中之一或两者.宏需要编译器在编译时执行代码,这可以通过解释宏代码,或者通过编译宏然后执行它来完成.因此,解释与编译实际上并不是一个问题(在几乎所有关于语言的讨论中都不是问题).

原文地址:https://www.jb51.cc/c/112412.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐