是否有可能编写一个将带任何宏并将其转换为函数的函数,以便可以将其作为参数传递给另一个函数?

问题描述 投票:0回答:3

AND和OR是宏,由于宏不是方案/机架中的第一类,因此它们不能作为参数传递给其他函数。部分解决方案是使用and-map或or-map。是否可以编写一个将带有任意宏并将其转换为函数的函数,以便可以将其作为参数传递给另一个函数?是否有具有一流宏的语言?

macros scheme racket
3个回答
3
投票

一般来说,不考虑到let被(或可能)实现为lambda之上的宏:

(let ((x 1))
  (foo x))

可能是一个扩展为]的宏>

((lambda (x) (foo x)) 1)

现在,将let转换为函数会是什么样?显然这是胡说八道。它的输入是什么?它的返回值?

许多宏都会像这样。实际上,任何可以在不丢失任何功能的情况下常规转换为功能的宏都是一个坏宏!这样的宏应该是一个函数。


2
投票

我同意@amalloy。如果将某些内容写为宏,则可能会执行某些功能无法执行的操作(例如,引入绑定,更改评估顺序)。因此,即使有可能,将任意宏自动转换为函数也是一个糟糕的主意。

是否有可能编写一个将带有任意宏并将其转换为函数以便可以将其作为参数传递给另一个函数的函数?


0
投票
不是您可能期望的方式

要了解原因,这是一种有关宏的思考方式:宏是一种函数,它需要一点源代码,然后将其转换为另一部分源代码:宏的扩展。换句话说,宏是一个函数,其域和范围为

源代码

© www.soinside.com 2019 - 2024. All rights reserved.