相对于我之前的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()
内的吗?)
答案 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小节。