2015-05-06 1 views
1

Когда я пишу прок в Tcl, которые возвращают значение на самом деле является результат другого прока я могу сделать одно из следующих действий (см неявного примера):Tcl возвращение против последнего оцениваются в проке - внутренности

proc foo args { 
... 
... 
bar $var1 
} 

Или я мог бы сделать (см явный пример):

proc foo args { 
... 
... 
return [ bar var1 ] 
} 

С точки зрения интерфейса, то есть вход по сравнению с выходом, два идентичны. Являются ли они внутренними?
Или есть некоторые дополнительные преимущества для неявного и явного возврата? Спасибо.

ответ

3

В Tcl 8.6 вы можете проверить байт-код, чтобы узнать, как сравниваются такие процедуры.

Если мы определим пару реализаций «суммы», а затем рассмотрим их с помощью tcl::unsupported::disassemble, мы увидим, что с помощью инструкции return или нет результат в том же байт-коде.

% proc sum_a {lhs rhs} {expr {$lhs + $rhs}} 
% proc sum_b {lhs rhs} {return [expr {$lhs + $rhs}]} 

% ::tcl::unsupported::disassemble proc sum_a 
ByteCode 0x03C5E8E8, refCt 1, epoch 15, interp 0x01F68CE0 (epoch 15) 
    Source "expr {$lhs + $rhs}" 
    Cmds 1, src 18, inst 6, litObjs 0, aux 0, stkDepth 2, code/src 0.00 
    Proc 0x03CC33C0, refCt 1, args 2, compiled locals 2 
     slot 0, scalar, arg, "lhs" 
     slot 1, scalar, arg, "rhs" 
    Commands 1: 
     1: pc 0-4, src 0-17 
    Command 1: "expr {$lhs + $rhs}" 
    (0) loadScalar1 %v0  # var "lhs" 
    (2) loadScalar1 %v1  # var "rhs" 
    (4) add 
    (5) done 

% ::tcl::unsupported::disassemble proc sum_b 
ByteCode 0x03CAD140, refCt 1, epoch 15, interp 0x01F68CE0 (epoch 15) 
    Source "return [expr {$lhs + $rhs}]" 
    Cmds 2, src 27, inst 6, litObjs 0, aux 0, stkDepth 2, code/src 0.00 
    Proc 0x03CC4B80, refCt 1, args 2, compiled locals 2 
     slot 0, scalar, arg, "lhs" 
     slot 1, scalar, arg, "rhs" 
    Commands 2: 
     1: pc 0-5, src 0-26  2: pc 0-4, src 8-25 
    Command 1: "return [expr {$lhs + $rhs}]" 
    Command 2: "expr {$lhs + $rhs}" 
    (0) loadScalar1 %v0  # var "lhs" 
    (2) loadScalar1 %v1  # var "rhs" 
    (4) add 
    (5) done 

return утверждение действительно только документально, что вы предназначены вернуть это значение, и это не просто побочный эффект. Использование return не является необходимым, но, на мой взгляд, его следует рекомендовать.

+0

Я использую Tcl 8.5. Но я предполагаю, что это то же самое. Спасибо! – user1134991

+0

'дизассемблировать' тоже в 8.5. Байт-код практически одинаковый; в 8.6 есть несколько дополнительных оптимизаций, но они незначительны. –