【问题标题】:Racket vs Scheme macrosRacket 与 Scheme 宏
【发布时间】:2012-10-24 22:21:44
【问题描述】:

球拍宏是否具有比 Scheme 或 Common Lisp 中的功能更高级的功能?我怀疑是这样,尤其是在模块、命名空间和范围等方面,但我希望能简单介绍一下 Racket 宏可以做什么,如果有的话,其他 lisps 不能。

此外,Scheme/CL 还向开发人员公开了阅读器层,并且使用它,在那些 lisps 中是否不可能创建全新的语言(不仅仅是 s-expr 宏),例如 Scribble,你可以在球拍?

换句话说,Racket 仅仅是围绕“面向语言的编程”的哲学/约定,并为此目的提供了方便的句法包装器,还是从根本上扩展了 Scheme 以完成该语言在技术上不可能完成的事情?

非常感谢。

【问题讨论】:

    标签: macros scheme racket


    【解决方案1】:

    我会推荐阅读 Matthew Flatt 的论文 "Composable and Compilable Macros - You Want it When?"

    它解释了宏和模块如何在 Racket 中协同工作。

    然后在 Racket 中实现一种小语言 - 比如 TinyBasic。 然后与其他语言进行比较。

    更新

    http://www.cs.utah.edu/plt/publications/jfp12-draft-fcdf.pdf

    【讨论】:

      【解决方案2】:

      在@Scott 将同一问题发布到列表后,另请参阅Matthew's reply,并附有更新的概述论文。

      【讨论】:

        【解决方案3】:

        使“面向语言的编程”在 Racket 中发挥作用的两个关键特性是:

        • 模块系统允许指定基础语言
        • 上下文相关的宏

        第一个项目符号基本上就是#lang 所做的。让模块系统负责设置阅读器,并且给定模块中可用的绑定允许轻松使用不同的语言。没有这个,使用像 Scribble 或 at-exp 这样的语言会更加麻烦。

        第二个是 Racket 提供了可覆盖的上下文相关宏,例如 #%app#%module-begin 等,允许自定义模块内的每个功能应用程序或整个模块。例如,这允许在整个模块上添加类型检查。

        这不是帮助在 Racket 中构建语言的功能的详尽列表。如果您有兴趣阅读更多相关信息,"Languages as Libraries" 论文值得一读。

        【讨论】:

          猜你喜欢
          • 2011-03-21
          • 2018-11-10
          • 2014-03-08
          • 1970-01-01
          • 1970-01-01
          • 2011-08-06
          • 2011-10-31
          • 1970-01-01
          • 2019-08-10
          相关资源
          最近更新 更多