TCL троичный expr делает обработку вывода
Он включает TCL 8.6 и получен из ответа, который я получил на проблему Nitpicking: сохранение Tcl в переменной или нет, для скорости, в процедурах Итак, рассмотрим этот код:
proc me1 { in1 in2 } {
if { $in1 > $in2 } {
return [ k $in1 ]
} else {
return [ k2 $in2 $in1 ]
}
}
proc me { in1 in2 } {
expr { $in1 > $in2 ? [ k $in1 ] : [ k2 $in2 $in1 ] }
}
proc k {in1 } {
puts "returnal should be \"0${in1}\""
return "0${in1}"
}
proc k2 { in1 in2 } {
return "01${in1}00 ${in2}"
}
Похоже, что procs me и me1 должны возвращать одно и то же значение (на самом деле, если аналогичный код был написан на Ruby или PERL). Это определенно не так в TCL. Теперь рассмотрим вывод me и m1 (помните, что если вызывается k, выводится "ожидаемое возвращение"):
puts [ me 23 0 ]
>returnal should be "023"
>19
puts [ me1 23 0 ]
>returnal should be "023"
>023
Так, expr и / или троичный делают что-то "под капотом", обрабатывая "возврат". Вопрос в следующем:
1. Что это делает?
2. Как это можно отключить?
1 ответ
Так, expr и / или троичный делают что-то "под капотом", обрабатывая "возврат". Вопрос в следующем:
- Что оно делает?
- Как это можно отключить?
Это не троичная, а общая семантика expr
, Эта команда задокументирована и определена так, чтобы возвращать нормализованное числовое значение, если это вообще возможно, и нормализация делает такие вещи, как преобразование числовых значений в десятичное. Например, это будет конвертировать 023
(который выглядит как восьмеричное значение) в 19
(= 2 × 81+ 3 × 80).
Вы не можете изменить expr
в этой области; это определенная часть семантики (которая может быть удалена в будущей версии, но кто хочет просто подождать?). Если это проблема, вам нужно использовать if
версия команды у вас уже есть, так как она не имеет семантики преобразования в числовой, если возможно.