代码之家  ›  专栏  ›  技术社区  ›  Unknown

静态类型如何限制宏?

  •  10
  • Unknown  · 技术社区  · 17 年前

    我在读保罗·格雷厄姆的《百年语言》一文。

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

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

    例如,类型似乎是 取之不尽用之不竭的研究源泉 报纸,尽管事实上 键入似乎排除了真正的宏-- 没有它,在我看来,没有 语言是值得使用的。

    这是怎么回事?报纸在哪里?我尝试在谷歌上搜索,但没有成功。

    5 回复  |  直到 12 年前
        1
  •  9
  •   itowlson    17 年前

    静态类型并不排除宏。例如,静态类型 Boo language has macros . 所以 Nemerle .

    然而,这取决于格雷厄姆所说的“真”宏是什么意思。也许boo和nemerle宏在他的标准上是“错误的”。

        2
  •  2
  •   Doug McClean    17 年前

    静态类型排除宏并不是真的,但它通常意味着宏系统需要比许多人熟悉的不卫生的文本替换宏更复杂。我不确定格雷厄姆到底想说什么,也不知道他说的“真正的”宏是什么意思。

    见 this paper 例如,在静态类型的上下文中使用卫生宏。

    (顺便说一下,我也不同意没有宏的语言是不值得使用的。我认为,一级函数与一些更复杂的现代类型系统相结合,可以优雅地解决大多数传统宏所面临的问题。)

        3
  •  2
  •   J D    13 年前

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

    没有“真正的宏”的定义,这是一个毫无意义的声明,但ocaml在paul graham编写之前既有静态类型,也有(ast重写)宏。他本可以自己轻易地发现这一点,但显然没有。我甚至看不到逻辑上的理由相信静态类型排除了宏。

    报纸在哪里?

    我什么都不知道。Lisp风格的宏现在不流行。

    记住,paul graham是一个哲学专业的学生,他用lisp编写了一个购物车,被雅虎收购并随后重写。他赚了很多钱,很年轻就退休了,然后花了好几年时间写这样的东西。

        4
  •  1
  •   phoebus    17 年前

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

        5
  •  0
  •   kuzzooroo    12 年前

    保罗·格雷厄姆是 "the whole language there all the time" :

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

    在读取时运行代码允许用户重新编程lisp的语法;运行 编译时的代码是宏的基础;运行时编译是 在诸如 emacs;运行时读取使程序能够使用 s-expressions,最近被重新发明为xml。

    因此,他可能指的是在运行时用一种语言定义新类型的实际不可能性,这种语言希望在编译时拥有所有类型信息,如daniel ribeiro points out on his blog :

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

    我敢肯定,如果程序员怀疑这种能力值得放弃静态类型带来的好处,那么您一定会找到他们的。