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 и / или троичный делают что-то "под капотом", обрабатывая "возврат". Вопрос в следующем:

  1. Что оно делает?
  2. Как это можно отключить?

Это не троичная, а общая семантика expr, Эта команда задокументирована и определена так, чтобы возвращать нормализованное числовое значение, если это вообще возможно, и нормализация делает такие вещи, как преобразование числовых значений в десятичное. Например, это будет конвертировать 023 (который выглядит как восьмеричное значение) в 19 (= 2 × 81+ 3 × 80).

Вы не можете изменить expr в этой области; это определенная часть семантики (которая может быть удалена в будущей версии, но кто хочет просто подождать?). Если это проблема, вам нужно использовать if версия команды у вас уже есть, так как она не имеет семантики преобразования в числовой, если возможно.

Другие вопросы по тегам