Programming languages 静态类型如何限制宏?

Programming languages 静态类型如何限制宏?,programming-languages,macros,static-typing,Programming Languages,Macros,Static Typing,我在读保罗·格雷厄姆的《百年语言》一文 在那里,他声称静态类型“排除了真正的宏” 例如,类型似乎是一个 取之不尽的研究资源 文件,尽管事实是静态的 键入似乎排除了真正的宏-- 在我看来,没有这一点,就不可能 语言是值得使用的 这是怎么回事?报纸在哪里?我尝试在谷歌上搜索,但没有成功。静态键入并不排除宏。例如,静态类型。我也是 然而,这取决于格雷厄姆所说的“真”宏是什么意思。按照他的标准,Boo和Nemerle宏可能是“错误的”。系统不推断类型的静态类型阻止了真正的通用宏,因为宏的输出必须在非常

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

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

例如,类型似乎是一个 取之不尽的研究资源 文件,尽管事实是静态的 键入似乎排除了真正的宏-- 在我看来,没有这一点,就不可能 语言是值得使用的


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

静态键入并不排除宏。例如,静态类型。我也是


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

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

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

有关静态类型上下文中卫生宏的一种用法,请参见

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

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

如果没有“真正的宏”的定义,这是一个毫无意义的声明,但在Paul Graham写这篇文章之前,OCaml既有静态类型也有(AST重写)宏。他本可以轻易地为自己发现这一点,但显然没有。我甚至不认为有逻辑上的理由相信静态类型排除了宏

报纸在哪里

我不知道有什么。Lisp风格的宏现在已经不流行了


请记住,保罗·格雷厄姆(Paul Graham)是哲学专业的学生,他用Lisp编写了一个购物车,该购物车被雅虎收购,随后被改写。他获得了金牌,年轻时退休,然后花了数年时间写了这样的东西。

保罗·格雷厄姆(Paul Graham)是一位拥有:

读取时间、编译时间和存储时间之间没有真正的区别 运行时。您可以在读取、读取或运行代码时编译或运行代码 并在运行时读取或编译代码

在读取时运行代码可以让用户重新编程Lisp的语法;跑步 编译时的代码是宏的基础;在运行时编译是非常困难的 Lisp作为扩展语言在诸如 Emacs;运行时读取使程序能够使用 s-expressions,一个最近被重新定义为XML的概念

因此,他可能指的是在运行时用一种期望在编译时拥有所有类型信息的语言定义新类型的实际不可能性,如Daniel Ribeiro:

请注意,不能在中进行类型安全的运行时元编程 将军。例如:即使某些语言允许您创建 编译时不存在的接口,这是调用 这些方法是通过非类型安全的方法(如反射)实现的


我相信,如果程序员认为这种功能值得放弃从静态类型中获得的好处,那么您将很容易找到他们。

支持Graham断言的一个证据是,似乎没有人对创建或使用一种静态类型的语言感兴趣,而这种语言在未来会像Lisp那样发展宏的服务:或多或少地放弃语法,迫使每个人都从解析树的角度思考,顺便说一下,解析树可以表示为列表(语言的基本数据结构)。2019,在这里,每一个新的语言朱丽亚,Nim,Haskell,斯卡拉,Culjule,IrxIR,Read,D,C++支持宏或一些宏的形式…@ AOE2525:C++(1985),Haskell(1990),D(2001),Scala(2004),Culjule(2007)和NIM(2008)都是10岁以上。Rust(2010)、Elixir(2012)和Julia(2012)是新版本,但Elm(2012)、Typescript(2012)、Purescript(2013)、Swift(2014)、Unison(2015)、Reason(2016)和Darkang(2019)仍然更新,不支持Lisp风格的宏。C++和D只提供C样式宏。Haskell和Scala并不真正支持宏:它们只有实验性的项目。link已经死了。知道那家报纸的名字吗?总是有不安全的地方。。。。