В связи с моим предыдущим вопросом я попытался создать функцию 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()
?)