XQuery:懒惰地评估导入的变量吗?

时间:2015-12-21 16:33:12

标签: xquery saxon basex

我有一个XQuery库模块,包括一些不带参数的函数。 我考虑将这些函数重写为变量,以便更快地访问它们。

然而,其中一些内容是计算上昂贵的表达方式。作为函数,它们显然只有在被调用时才会被评估。但作为变量,我不确定在导入库模块时是否会自动评估它们。

只有一些导入此模块的查询才会使用这些变量,并证明其评估的合理性。对于不使用变量的其他人来说,所述评估将是不必要的开销。

如果导入的变量被懒惰地评估,那就不会有问题:我可以在任何查询上导入库模块,知道只有在主模块实际使用时才会评估这些昂贵的变量。

我知道这只是写prefix:myImportedFunction()$prefix:myImportedVariable的问题,但这是一个我想消除的不确定性。

我认为这种行为取决于实现。我对BaseX和Saxon-HE的行为特别感兴趣。他们懒惰地评估导入的变量吗?

2 个答案:

答案 0 :(得分:2)

Saxon通常会对全局变量使用延迟评估。例外情况是启用了运行时跟踪(如果在IDE中进行调试,则可以执行此操作);然后切换到急切的评估,使调试更容易处理。

答案 1 :(得分:2)

在BaseX中,如果在执行的代码中引用了这些变量,那么这些变量将被优化(并因此可能被预先评估)。例如,在以下表达式中,不会评估$ v:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:bottom="@dimen/pointing_arrow_size">
        <shape android:shape="rectangle" >
            <solid android:color="#FFFF00" />
        </shape>
    </item>
    <item android:height="@dimen/pointing_arrow_size"
        android:gravity="bottom">
        <shape android:shape="rectangle" >
            <solid android:color="#00000000" />
        </shape>
    </item>
</layer-list>

选择访问变量的预评估是因为它在BaseX中启用了许多后续优化。但是,可以通过添加Q{http://basex.org}lazy annotation

来强制执行对变量的延迟评估
<klogi.com.viewpagerwithdifferentmenu.CustomTabLayout.TabLayoutWithArrow
    android:id="@+id/tabLayout"
    android:background="@drawable/tab_layout_background"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>