当前位置: 首页 > 面试题库 >

使用Lisp宏可以做什么,而使用一流函数则不能做什么?

杜河
2023-03-14
问题内容

我想我了解Lisp宏及其在编译阶段的作用。

但是在Python中,您可以将一个函数传递给另一个函数

def f(filename, g):
  try:                                
     fh = open(filename, "rb") 
     g(fh)
  finally:
     close(fh)

因此,我们在这里得到了懒惰的评估。我可以使用宏而不是使用函数作为一流对象怎么办?


问题答案:

首先,Lisp也具有一流的功能,因此您也可以问:“如果我已经具有一流的功能,为什么在Lisp中需要宏”。答案是一流的函数不允许您使用语法。

从表面上看,一流的函数允许您编写f(filename, some_function)f(filename, lambda fh: fh.whatever(x)),但不允许编写f(filename, fh, fh.whatever(x))。尽管可以说这是一件好事,因为在最后一种情况下,fh突然来自何处尚不清楚。

更重要的是,函数只能包含有效的代码。因此,您不能编写reverse_function将函数作为参数并“反向”执行的高阶函数,从而reverse_function(lambda: "hello world" print)可以执行print "hello world"。使用宏,您可以执行此操作。当然,这个特定示例非常愚蠢,但是在嵌入领域特定语言时,此功能非常有用。

例如,您无法loop在python中实现常见的lisp构造。地狱,for ... in如果它不是真正内置的,您甚至无法在python中实现python的构造-至少不是使用该语法。当然,您可以实现for(collection, function),但要漂亮得多。



 类似资料:
  • 问题内容: 在Python中,用于初始化不可变类型,通常用于初始化可变类型。如果将其从语言中删除,该怎么办(轻松)? 例如, 可以这样重写: 为澄清问题的范围:这不是一个问题关于如何以及是使用或它们之间有什么区别。这是一个问题,如果从语言中删除将会发生什么。有什么坏事吗?事情会变得很难或不可能吗? 问题答案: 您可以在中进行的所有操作都可以在中完成。 那么,为什么要使用? 因为您不必将实例存储在变

  • 问题内容: 据我所知,一个唯一可以做的事和一个不能做的事就是打电话给。 由于我们尚未调用,因此in 会在进入第一遍之前准备状态对象。本质上是相同的: 但是我看到了另一个有用的用例(在服务器端)。 让我们考虑一些异步的东西: 在这里,我们不能使用as分配来不会触发。 怎么样的?根据React docs : 在挂载发生之前立即调用。在之前调用),因此在此方法中设置状态不会触发重新渲染。避免在此方法中引

  • 问题内容: 我开始学习Python,并且遇到过生成器函数,这些函数中包含yield语句。我想知道这些功能确实可以解决哪些类型的问题。 问题答案: 生成器为您提供懒惰的评估。您可以通过遍历它们来使用它们,可以显式地使用“ for”,也可以隐式地将其传递给任何迭代的函数或构造。您可以将生成器视为返回多个项目,就像它们返回一个列表一样,但是与其一次一次返回它们而不是一次全部返回它们,而是将生成器功能暂停

  • 本文向大家介绍Python可以用来做什么,包括了Python可以用来做什么的使用技巧和注意事项,需要的朋友参考一下 Python技术可做web开发 很多人只了解Java、PHP可做web开发,但针对Python也可以做web开发却了解很少。很多人将会不清楚,Python实际上是和互联网技术一起长大的。做为动态性语言,而且具备高些的抽象层次的Python和Perl,迅速就被开发者们发觉更合适用以开发

  • 或者,更准确地说:在我看来,这只是将函数的功能复制为应用程序,但语法更为冗长。 所以,你能给我一个例子,阅读器单子能做的功能,而应用程序不能吗? 实际上,我还想问这两个:应用函数或Reader monad有什么用--因为虽然能够将相同的参数应用到四个函数(、、、)而不重复这个参数四次,确实减少了一些重复性,但我不确定这种微小的改进是否证明了这种复杂程度是合理的;所以我想我一定是遗漏了一些突出的东西

  • 问题内容: 一位同事最近问我如何深度克隆Map,我意识到我可能从未使用过clone()方法,这让我感到担忧。 您发现需要在何处克隆对象的最常见情况是什么? 问题答案: 我假设您是用Java 指的。如果是,请告知它存在一些主要问题,并且在大多数情况下,建议不要使用它。请参阅Joshua Bloch撰写的“ Effective Java”中 的第11项,以获取完整答案。我相信您可以安全地在原始类型数组