Shimomura Ikkei

lua-users home
wiki

我正打算写一篇关于函数式编程的教程 ? :) 在创建新页面之前,这里是一些零散的想法。我还没有研究现有的资料。

目前对Lua的兴趣和想法

Lua中的函数式编程、迭代器、生成器、组合子。以及使用协程实现惰性求值。

Lua的虚拟机和字节码。例如,作为bind2的实现,不是通过包装匿名函数来改变参数顺序,而是将绑定值注入函数代码(可能在字节码和常量字段中)。

当前问题

我复制了所有元素,但我需要的是引用。
假设它们是常量,我不会改变表。

备忘:Range、Slice对象,它们拥有对原始数据的引用,
以及索引信息。在需要数据时查找项。
但是由于表是可变数据,如何通知原始数据已被更新?
“Self”可能在这类主题上有相关论文,不过……

        -- Lua sais: attempt to call global `fact' (a nil value)
        local fact = function(num) if (num > 1) return n*fact(num-1) else return 1 end end
        

        -- this is ok. calls global 'fact'
        fact = function(num) if (num > 1) return n*fact(num-1) else return 1 end end
        

        -- but since the closure depend to global, see code below
        temp = fact
        fact = function (num) return num end
        print(temp(10)) -- temp(10) returns 90
        

这对于大家来说不是什么严重的问提,
因为我们很少改变递归调用函数的名称。
你可以简单地制定一个局部规则“*不改变函数*”,作为君子协定。

关键在于,函数名是在运行时在全局作用域中查找的。
而那就是允许来自外部作用域影响的空间。

我知道的解决方案有:
Y-Combinator,将函数本身作为函数的第一个参数传递。
或者像Perl6那样,提供一个引用函数本身的特殊变量。

        -- the 'a' in table is nil.
        local a = { a }

        -- what the function f returns ? ... 
        local f = function() return f end 
        

函数中的“f”是函数创建时的“f”。
这似乎是正确的局部/静态作用域行为。
pharps,我认为是用于绑定递归函数的“let-rec”。

代码示例


RecentChanges · preferences
编辑 · 历史
最后编辑于 2005年5月20日 上午9:41 GMT (差异)