用于检查可选参数的测试功能

时间:2018-12-15 00:06:20

标签: chapel optional-arguments

相对于我之前的question,我试图制作一个函数present()来检查可选参数的存在。但是,以下代码

proc present( x ) { return x.type != void; }

proc test( a: ?T = _void )
{
    writeln();
    writeln( "test| a = ", a );
    writeln( "test| condition    = ", a.type != void );
    writeln( "test| present( a ) = ", present( a ) );

    if present( a )       // error (Line 1)
    // if a.type != void  // works (Line 2)
    {
        a = 10;
    }
}

// no optional arg
test();

// pass an optional array
var arr: [1..5] int;
test( a = arr );

writeln();
writeln( "main| arr = ", arr );

给出编译时错误

mytest.chpl:3: In function 'test':
mytest.chpl:13: error: illegal lvalue in assignment
mytest.chpl:13: error: a void variable cannot be assigned

表示行a = 10;有问题。另一方面,如果我使用第2行而不是第1行,则代码将按预期工作:

test| a = 
test| condition    = false
test| present( a ) = false

test| a = 0 0 0 0 0
test| condition    = true
test| present( a ) = true

main| arr = 10 10 10 10 10 

此外,如果我将第1行或第2行替换为if isArray( a ),该代码也可以使用。这是否意味着当a = 10;a时,我们需要让编译器明确知道未到达行_void吗? (换句话说,present()不足以让编译器知道它,因为测试条件是“隐藏”在present()内的吗?)

1 个答案:

答案 0 :(得分:3)

  

这是否意味着我们需要让编译器明确知道   线a = 10; _void时未达到? (换句话说,是   present()不足以让编译器知道它,因为测试   条件是在present()中“隐藏”了吗?)

是的,没错。编译器需要在编译时知道if的主体仅在参数不为空的情况下才应编译。将x.type != void放在该条件中是一个合理的解决方案,但是如果您想要一个函数来计算是否应该评估该条件,则可以这样做。只需将present标记为param函数-这意味着它返回在编译时应该知道的值。这是完整的示例:

proc present( x ) param { return x.type != void; }

proc test( a: ?T = _void )
{
    writeln();
    writeln( "test| a = ", a );
    writeln( "test| condition    = ", a.type != void );
    writeln( "test| present( a ) = ", present( a ) );

    if present( a )
    {
        a = 10;
    }
}

// no optional arg
test();

// pass an optional array
var arr: [1..5] int;
test( a = arr );

writeln();
writeln( "main| arr = ", arr );

如果您想了解有关此区域语言设计的更多信息,请参阅"The Param Return Intent"的“过程”一章“返回意图”中的language specification小节。