首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问块内的外部变量和Y-组合器

访问块内的外部变量和Y-组合器
EN

Stack Overflow用户
提问于 2015-03-16 17:05:23
回答 1查看 209关注 0票数 8

我希望你们都能好起来。我正在港口实现定点Y-组合器,我遇到了一些麻烦。嗯,Y-组合子可以由lambda微积分定义为:

Y = (λh.λF.F(λ x.((h(h))(F))(x))) (λh.λF.F(λ x.((h(h))(F))(x)))

我正试图通过性能问题来应用Y-combinator的回忆录。我目前的实现是:

代码语言:javascript
复制
Function YMem( bF, aCache )
   Local xAnswer
    If !lCache ; lCache := { } ; EndIf
    Return { |Arg| Iif( aCache[ Arg ] ;
        , /* then      */ aCache[ Arg ];
        , /* otherwise */ aCache[ Arg ] := ;
            Eval( Eval( bF, { |N| Eval( Eval( YMem, bF, aCache ), N ) } ), Arg ) ) }

基本上,我不能在块中使用语句,但我可以使用表达式,它工作得很好。我避免了无限的递归和经过0到无穷大的限制。

在此之前,它编译得很好,但是当我试图访问外部块的一个变量时,海港就会踢我的脸!

为了测试Y-combinator实现,我尝试应用fibonacci序列的简单实现,但是当我返回一个接收参数G的块并隐式返回接收参数N的块时,G对我来说是不可用的,编译器告诉我“外部代码块无法访问”。

代码语言:javascript
复制
Function Main
    Local bFib := YMem( { |G| ;
        { |N| ;
            Iif( N == 0, 1, Iif( N == 1, 1, Eval( G, N - 1 ) + Eval( G, N - 2) ) );
        } ;
    } )
    Return

这也将使我可以咖喱积木。我的问题是:在海港,我如何访问块内的外部变量?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-19 13:50:35

在港湾、快船和基于xBase的编程语言中,块永远不能引用父块的变量。块不是闭包。我们可以通过创建本地存储库并在内部块中使用它们来达到这一目的:

代码语言:javascript
复制
Function TestOuterScope
  Local accA
  Local bAdd := { |A| accA := A, { |B| accA + B } }
  Return Eval( Eval( bAdd, 10 ), 20 )
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29082774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档