代码之家  ›  专栏  ›  技术社区  ›  cdiggins

分配生成器函数时应该发生什么?[关闭]

  •  0
  • cdiggins  · 技术社区  · 15 年前

    如果我有一种具有一流函数的编程语言。当一个生成器函数被共享时,语义应该是什么?

    例如:

    var f = function() { 
      foreach (i in 0..42)
         yield i;
    }
    
    int a = f(); // 0
    int b = f(); // 1
    
    // Assigning the generator function 
    var g = f;
    
    int c = g(); // ??
    int d = f(); // ??
    

    我可以想象三件事:

    1. C==2,D==3表示发电机功能是共享的
    2. C==0,D==2表示创建了一个新的生成器函数,并初始化了值
    3. C==2,D==2意味着通过复制生成器的当前状态来创建新的生成器函数

    在我看来,最好的答案是,提供一个或另一个机制最有说服力的论据。我经常发现现有技术是最有说服力的论据。

    1 回复  |  直到 9 年前
        1
  •  2
  •   Yuval Adam    15 年前

    如果您的语言中有引用语义,并且赋值通常是引用赋值,那么您需要选项1。

    这就是在python中发生的事情,在那里生成 对象和分配 引用赋值(即使调用.next()来检索下一个值,而不是“调用”生成器)。

    下面是一个在Python中的简短演示:

    >>> def gen():
    ...   for i in range(42):
    ...     yield i
    ... 
    >>> f = gen().next
    >>> a = f()
    >>> b = f()
    >>> g = f
    >>> c = g()
    >>> d = f()
    >>> a, b, c, d
    (0, 1, 2, 3)