在 Scheme 或 Racket 中何时使用函数以及何时使用宏

Har*_*ier 5 scheme racket

有人可以提供一些关于何时使用 Scheme 或 Racket 宏以及何时使用函数的一般指南。

如果您没有创建新语法并且没有对变量产生副作用,那么在某些情况下您必须(或者更合适)使用宏而不是函数?

Dan*_*ton 7

宏允许您使用完全不同的语法。宏调用根本不必看起来像函数调用,尽管最简单的宏通常如此。此外,宏在运行时之前的单独阶段中执行。所以,如果你需要不同的语法,或者如果你想在运行前扩展宏,那么,好吧,使用宏。

一般来说,我会说如果你可以用一个函数干净利落地做到这一点,那么就使用一个函数。

  • 另一种看待它的方式:宏让你决定在编译时和运行时应该发生什么样的计算。编译时计算通常处理语法问题。但是有些程序主要依赖于编译时计算,例如 Typed Racket 等类型语言的类型检查阶段。大多数程序员不需要进行大量的编译时计算,所以除非你真的需要在编译时表达计算,否则坚持使用普通的普通函数。 (2认同)