使用宏的伟大应用程序和程序的集合

Posted

技术标签:

【中文标题】使用宏的伟大应用程序和程序的集合【英文标题】:Collection of Great Applications and Programs using Macros 【发布时间】:2011-05-31 17:32:05 【问题描述】:

我对宏非常感兴趣,并且刚刚开始了解它的真正力量。请帮我收集一些宏系统的伟大用法。

到目前为止,我有这些构造:

模式匹配:

安德鲁·赖特和布鲁斯·杜巴。图案 匹配方案,1995

Prolog 精神中的关系:

多莱西塔拉姆。在 schelog 中编程。 http://www.ccs.neu.edu/home/dorai/schelog/schelog.html

丹尼尔·P·弗里德曼、威廉·E·伯德、 和奥列格·基谢廖夫。理性的 计划者。麻省理工学院出版社,2005 年 7 月

马蒂亚斯·费莱森。音译 Prolog 进入 Scheme。技术报告 182,印第安纳大学,1985 年。

可扩展循环结构:

塞巴斯蒂安·埃格纳。急切的理解 方案:SRFI-42的设计。在 方案和功能研讨会 编程,第 13-26 页,9 月 2005.

奥林颤抖着。循环的解剖:a 范围和控制的故事。在 国际功能会议 编程,第 2-14 页,2005 年。

班级系统:

PLT。 PLT MzLib:库手册。 技术报告PLT-TR2006-4-v352, PLT 计划公司,2006 年。 http://www.plt-scheme.org/techreports/

伊莱·巴兹莱。骗取。 http://www.barzilay.org/Swindle.

组件系统:

瑞恩·卡尔佩珀、斯科特·欧文斯和 马修·弗拉特。句法抽象 在组件接口中。在 国际生成会议 编程和组件工程, 第 373–388 页,2005 年

软件合同检查

马修·弗拉特和马蒂亚斯·费莱森。 单元:HOT 语言的酷模块 在 ACM SIGPLAN 会议上 编程语言设计和 实施,第 236-248 页,1998 年

Oscar Waddell 和 R. Kent Dybvig。 扩展句法范围 抽象。在原则研讨会上 编程语言,页面 203–215, 199

解析器生成器

斯科特·欧文斯、马修·弗拉特、奥林 颤抖和本杰明麦克马伦。词法分析器 和 Scheme 中的解析器生成器。在 方案和功能研讨会 编程,第 41-52 页,9 月 2004.

工程语义工具:

马蒂亚斯·费莱森,罗伯特·布鲁斯 芬德勒和马修·弗拉特。语义 使用 PLT Redex 进行工程设计。麻省理工学院出版社, 2009 年 8 月。

编译器转换规范:

Dipanwita Sarkar、Oscar Waddell 和 R. Kent Dybvig。纳米通道 编译器教育框架。 功能杂志 编程,15(5):653–667,九月 2005. 教育明珠。

新颖的执行方式

可序列化的 Servlet 继续 Greg Pettyjohn, John 克莱门茨、乔·马歇尔、施莱拉姆 克里希那穆提和马提亚斯费莱森。 广义堆栈的延续 检查。在国际 函数式编程会议, 第 216-227 页,2005 年。

定理证明系统

塞巴斯蒂安·埃格纳。 Scheme中的急切理解:设计 SRFI-42。 在方案和函数式编程研讨会中,第 13-26 页, 2005 年 9 月。

带有类型的基础语言扩展

Sam Tobin-Hochstadt 和 Matthias Felleisen.The 设计和 类型化方案的实现。在 编程原理研讨会 语言,第 395–406 页,2008 年。

懒惰

伊莱·巴兹莱和约翰·克莱门茨。 不劳而获的懒惰 工作:懒惰与严格相结合 教学语言。在功能 和声明式编程 教育,第 9-13 页,2005 年。

功能反应性

Gregory H. Cooper 和 Shriram 克里希那穆提。嵌入动态 值调用语言中的数据流。 在欧洲编程研讨会上, 2006


参考:

收集自Ryan Culpepper's Dissertation

【问题讨论】:

+1 好问题。我认为在 cstheory.SE 上询问或将其迁移到那里会很有用,因为看起来类似的问题,例如 What's new in purely functional data structures since Okasaki?,那里有更多的视图。 我把它贴在那里。但我得到了反对意见。 @Yasir 和 kujaan,这不是一个研究级别的问题,所以不属于 cstheory,它可能属于程序员 如果你想要 usage 例子,也不是特别理论 顺便说一句,为什么是“卫生”标签?列出的示例中至少有一半是常见的 lisp 样式的宏。 【参考方案1】:

Culpepper 和 Felleisen,Fortifying Macros,ICFP 2010

Culpepper、Tobin-Hochstadt 和 Felleisen,高级宏观和类型化方案的实施,2007 年方案研讨会

Flatt, Findler, Felleisen, Scheme with Classes, Mixins, and Traits, APLAS 2006

Herman, Meunier,通过部分评估改进嵌入式语言的静态分析,ICFP 2004

【讨论】:

“Scheme with Classes, Mixins, and Traits”是一篇令人印象深刻的论文,提供了非常有用的参考资料。谢谢推荐。【参考方案2】:

Shivers、Carlstrom、Gasbichler 和 Sperber(1994 年及以后)The Scsh Reference manual。

有很多使用宏将迷你语言嵌入到 Scheme 中的好例子。向我介绍了定义隐式引用其参数的宏的技术。看看过程形式、正则表达式和类似 awk 的迷你语言的使用。 Scsh 是我推荐使用宏的起点。

希尔斯代尔和弗里德曼 (2000) Writing Macros in Continuation-Passing Style.

展示了如何使用连续传递样式使弱语法规则宏变得强大。举了很多例子。

Flatt、Culpepper、Darais 和 Findler(已提交)Macros that Work Together - Compile-Time Bindings, Partial Expansion, and Definition Contexts。

提供 Racket/PLT 方案中宏方法的概述和语义。例子不多,但我认为这篇论文有你正在寻找的东西。

【讨论】:

【参考方案3】:

阅读计划!记得查看 ReadScheme 上的大量参考书目。

http://library.readscheme.org/page3.html

我认为您错过的一个示例是将 SQL 语法嵌入到 Scheme。 http://repository.readscheme.org/ftp/papers/sw2002/schemeunit-schemeql.pdf

宏也用于编写自动化测试的支持。

【讨论】:

【参考方案4】:

不是一个 Scheme,但有点类似 Lisp 方言,并大量使用了宏:http://www.meta-alternative.net/mbase.html

有宏实现各种模式匹配、列表解析、各种解析器生成器(包括 PEG/Packrat 实现)、嵌入式 Prolog、ADT 访问者推断(如在 Haskell 中废弃样板文件)、可扩展语法宏、Hindley-Milner类型系统、类似 Scheme 的语法宏等等。该功能的一部分可以潜在地移植到 Scheme,其他部分需要具有显式上下文的扩展宏系统。

【讨论】:

【参考方案5】:

我会将“Scheme 标准库本身”添加到列表中。查看 guile 发行版中的文件boot-9.scm。许多最常用的 Scheme 形式——caseand 等——都被定义为宏。

【讨论】:

【参考方案6】:

Here's 一个非常棒的使用方案宏来创建用方案编写的高效机器人系统的示例

【讨论】:

【参考方案7】:

这并不是特别精确,因为它分布在大量非常古老的出版物中,其中大部分我从未阅读过,但是 IIRC 大块 Common Lisp 对象系统和元对象协议*, 可;是;或者最初是用宏构建的......

* 恕我直言,这是迄今为止最先进的面向对象系统编程

【讨论】:

如果您可以将特定论文命名为一个好的起点,这个答案会好很多。 我知道,但所有有趣的论文都是在 70 年代写成的,这让它们很难找到 :( @charles,+1,但我希望谷歌搜索名称有点暗示下一步;)【参考方案8】:

查看我最喜欢的 REST API 实现之一:Slack api 客户端,它不是用 Scheme 编写的,而是用 Racket 编写的。

octotep/racket-slack-api

【讨论】:

以上是关于使用宏的伟大应用程序和程序的集合的主要内容,如果未能解决你的问题,请参考以下文章

处理传递给程序宏的编译时相关文本文件的正确方法

sh Greg的伟大指南:包,库,实用程序和工具

创建带有嵌入宏的 LibreOffice 文档

内联函数与宏的区别

1024:伟大的程序员日

关于sas宏的一点想法