下村一系

lua-users home
wiki

我正在考虑编写 FunctionalTutorial? :) 这里是一些草稿,在创建新页面之前。我还没有研究过现有的信息。

Lua 的当前兴趣和想法

Lua 中的函数式编程,迭代器,生成器,组合器。以及通过协程实现的惰性求值。

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

当前问题

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

MEMO: 范围,具有对原始数据的引用,
以及索引信息。在需要数据时查找项目。
但由于表是可变数据,如何通知原始数据已更新。
'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-组合器,将函数自身作为函数的第一个参数提供。
或者像 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"。

代码示例


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2005 年 5 月 20 日下午 3:41 GMT (差异)