是否有一个简单的lisp等价于Python';什么是发电机?

是否有一个简单的lisp等价于Python';什么是发电机?,lisp,common-lisp,generator,Lisp,Common Lisp,Generator,在Python中,您可以编写以下代码: def firstn(n): num = 0 while num < n: yield num num += 1 def firstn(n): num=0 当num (1 2 6 1 1 4 4 2 4 3 6 2 1 5 6 5 1 5 1 2) 然而,请注意图书馆的作者所说的: 这个图书馆更像是一个有趣的玩具,尽管据我所知 确实有效。我想我从来没有在应用程序代码中使用过这个, 虽然我认为

在Python中,您可以编写以下代码:

def firstn(n):
     num = 0
     while num < n:
         yield num
         num += 1
def firstn(n):
num=0
当num
lisp与此等效的是什么?

现有包 使用下载、安装和加载系统。然后,使用package
:generators
(或者最好先定义自己的包)

(ql:quickload:generators)
(使用包装:发电机)
为随机值定义无限生成器:

(取消骰子(n)
(使发电机()
;重复返回1到N之间的随机值
(循环(收益率(1+(随机n‘‘‘‘‘‘‘‘)’)
使用发电机:

(循环
带骰子=(骰子6)
重复20次
收集(下一个骰子)
=> (1 2 6 1 1 4 4 2 4 3 6 2 1 5 6 5 1 5 1 2)
然而,请注意图书馆的作者所说的:

这个图书馆更像是一个有趣的玩具,尽管据我所知 确实有效。我想我从来没有在应用程序代码中使用过这个, 虽然我认为如果小心的话,它可能是

另见
  • 包提供了一种定义方法,以便在其迭代工具中使用

  • 该包提供流式数据结构和对它们的操作

  • 库(据我所知,与
    生成器的方法相同)

闭包 实际上,CL并不像Python那样依赖于生成器。相反,当人们需要惰性序列时,他们会使用闭包:

(取消骰子(n)
(lambda()
(1+(随机n)))
然后,
next
的等价物就是调用由
dice
生成的thunk:

(循环
带骰子=(骰子6)
重复20次
收集(所有骰子)
这是首选的方法,特别是因为不需要像生成器那样依赖分隔的连续体。您的示例涉及骰子示例不需要的状态(有一个隐藏状态影响
random
,但这是另一个故事)。以下是计数器的典型实现方式:

(先解除第一个-n(n)
(让((柜台-1))
(lambda()
(当(<计数器n)
(incf计数器((())))
高阶函数 或者,您可以设计一个生成器,它接受一个回调函数,该函数由生成器为每个值调用。可以使用任何funcallable,这允许调用方保留对代码执行的控制:

(重复掷骰子(n回调)
(循环(funcall回调(1+(随机n '))))
然后,您可以按如下方式使用它:

(程序((计数器0)堆栈)
(重复掷骰子6
(λ(值)
(如有)(现有的方案)
下载、安装并加载系统。然后,使用软件包
:generators
(或者最好先定义自己的软件包)

(ql:quickload:generators)
(使用包装:发电机)
为随机值定义无限生成器:

(取消骰子(n)
(使发电机()
;重复返回1到N之间的随机值
(循环(收益率(1+(随机n‘‘‘‘‘‘‘‘)’)
使用发电机:

(循环
带骰子=(骰子6)
重复20次
收集(下一个骰子)
=> (1 2 6 1 1 4 4 2 4 3 6 2 1 5 6 5 1 5 1 2)
然而,请注意图书馆的作者所说的:

这个图书馆更像是一个有趣的玩具,尽管据我所知 确实有效。我想我从来没有在应用程序代码中使用过这个, 虽然我认为如果小心的话,它可能是

另见
  • 包提供了一种定义方法,以便在其迭代工具中使用

  • 该包提供流式数据结构和对它们的操作

  • 库(据我所知,与
    生成器的方法相同)

闭包 实际上,CL并不像Python那样依赖生成器。相反,当人们需要惰性序列时,他们会使用闭包:

(取消骰子(n)
(lambda()
(1+(随机n)))
然后,
next
的等价物就是调用由
dice
生成的thunk:

(循环
带骰子=(骰子6)
重复20次
收集(所有骰子)
这是首选的方法,特别是因为不需要像生成器那样依赖分隔的连续体。您的示例涉及一个dice示例不需要的状态(有一个隐藏状态影响
random
,但这是另一种情况)。以下是计数器的典型实现方式:

(先解除第一个-n(n)
(让((柜台-1))
(lambda()
(当(<计数器n)
(incf计数器((())))
高阶函数 或者,您可以设计一个生成器,该生成器接受一个回调函数,该函数由生成器为每个值调用。可以使用任何funcallable,这允许调用方保留对代码执行的控制权:

(重复掷骰子(n回调)
(循环(funcall回调(1+(随机n '))))
然后,您可以按如下方式使用它:

(程序((计数器0)堆栈)
(重复掷骰子6
(λ(值)

(如果(闭包)是我想要的。谢谢!奖金:泛型cl中的迭代器:闭包是我想要的。谢谢!奖金:泛型cl中的迭代器: