【问题标题】:How Does Static Typing Limit Macros?静态类型如何限制宏?
【发布时间】:2009-10-17 19:46:38
【问题描述】:

我正在阅读 Paul Graham 的“百年语言”文章。

http://www.paulgraham.com/hundred.html

在那里,他声称静态类型“排除了真正的宏”。

例如,类型似乎是 取之不尽的研究资源 论文,尽管事实上,静态 打字似乎排除了真正的宏—— 没有它,在我看来,没有 语言值得使用。

这是真的吗?论文在哪里?我尝试在 Google 上搜索但没有成功。

【问题讨论】:

标签: programming-languages macros static-typing


【解决方案1】:

Paul Graham 是 "the whole language there all the time" 的支持者:

读取时间、编译时间和 运行。您可以在阅读、阅读或运行代码的同时编译或运行代码 在编译时,在运行时读取或编译代码。

在读取时运行代码可以让用户重新编程 Lisp 的语法;跑步 编译时的代码是宏的基础;在运行时编译是 Lisp 在程序中用作扩展语言的基础,例如 埃马克斯;并且在运行时读取使程序能够使用 s-expressions,一个最近被重新发明为 XML 的想法。

因此,他可能指的是在运行时定义新类型实际上是不可能的,正如 Daniel Ribeiro points out on his blog

请注意,您不能在 一般的。例如:即使某些语言允许您创建 编译时不存在的接口,调用的唯一方法 这些方法是通过非类型安全的方式(例如反射)。

我相信您会毫不费力地找到那些认为这种能力值得放弃他们从静态类型中获得的好处的程序员。

【讨论】:

    【解决方案2】:

    “静态类型似乎排除了真正的宏” 这是怎么回事?

    如果没有“真正的宏”的定义,这是一个毫无意义的主张,但在 Paul Graham 写下之前,OCaml 既有静态类型也有(AST 重写)宏。他本可以很容易地为自己发现这一点,但显然没有。我什至没有理由相信静态类型会排除宏。

    文件在哪里?

    我不知道。 Lisp 风格的宏现在已经过时了。

    请记住,Paul Graham 是一名哲学专业的学生,​​他用 Lisp 编写了一个购物车,该购物车被雅虎收购并随后被重写。他挖到了金子,年轻时退休,然后花了几年时间写这样的东西。

    【讨论】:

    • 这里是 2019 年,每一种新语言 Julia、Nim、Haskell、Scala、Clojure、Elixir、Rust、D、C++ 都支持宏或某种形式的宏...
    • @aoeu256:C++ (1985)、Haskell (1990)、D (2001)、Scala (2004)、Clojure (2007) 和 Nim (2008) 都有 10 多年的历史。 Rust (2010)、Elixir (2012) 和 Julia (2012) 是新的,但 Elm (2012)、Typescript (2012)、Purescript (2013)、Swift (2014)、Unison (2015)、Reason (2016) 和 DarkLang (2019) ) 仍然较新,并且不支持 Lisp 样式的宏。 C++ 和 D 只提供 C 风格的宏。 Haskell 和 Scala 并不真正支持宏:它们只是有实验性的副项目。
    • @JD Scala 3 officially 支持宏。
    【解决方案3】:

    静态类型并不排除宏。例如,静态类型的Boo language has macrosNemerle也是如此。

    但是,这取决于格雷厄姆所说的“真正的”宏是什么意思。按照他的标准,也许 Boo 和 Nemerle 宏是“错误的”。

    【讨论】:

      【解决方案4】:

      静态类型排除宏并不是真的,但这通常意味着宏系统需要比许多人熟悉的不卫生的文本替换宏更复杂。我不完全确定 Graham 在这里想要表达什么,或者他所说的“真正的”宏是什么意思。

      请参阅this paper,了解静态类型上下文中的卫生宏。

      (顺便说一句,我也不同意没有宏的语言不值得使用。我认为一流的函数加上一些更复杂的现代类型系统可以优雅地解决大部分问题传统上针对的宏。)

      【讨论】:

      • 链接已失效。知道论文的名字了吗?
      【解决方案5】:

      系统不推断类型的静态类型阻止了真正通用的宏,因为宏的输出必须在非常严格的意义上保持类型安全。

      【讨论】:

        猜你喜欢
        • 2012-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        相关资源
        最近更新 更多