Как вы предоставляете аргументы по умолчанию для процедуры Tcl, которые оцениваются во время вызова?
Вот пример того, что я пробовал:
> tclsh
% proc test { {def [expr 4 + 3]} } { puts $def }
too many fields in argument specifier "def [expr 4 + 3]"
% proc test { {def {[expr 4 + 3]}} } {puts $def}
% test
[expr 4 + 3]
% test 5
5
% proc test { {def {[expr 4 + 3]}} } {puts [$def]}
% test
invalid command name "[expr 4 + 3]"
% proc test { {def {[expr 4 + 3]}} } {puts [eval $def]}
% test
invalid command name "7"
Пример только для упрощения кода. Конечно, в этом простом примере можно просто использовать {def 7}
, чтобы установить значение по умолчанию для процедуры.
Однако цель состоит в том, чтобы иметь возможность вызывать более сложную функцию, которая выдает хорошее значение по умолчанию при вызове процедуры test
. Значения по умолчанию могут отличаться.
Мое текущее решение состоит в том, чтобы по умолчанию использовать пустую строку и проверить, что:
% proc test { {def {}} } { if {$def == {}} { set def [expr 4 + 3] } ; puts $def }
% test
7
% test 5
5
Однако я считаю это недостаточно элегантным: должен быть способ поместить объявления в том месте, в котором они находятся: в заголовке.
Также, возможно, пустая строка может быть совершенно точным значением, заданным вызывающей стороной, которое не должно заменяться вызовом по умолчанию.
Другим обходным решением может быть просто использовать args
в качестве параметра, а затем проверить его. Но это обеспечивает еще менее явный декларативный стиль.
Есть идеи, как я могу включить eval в декларативный заголовок proc?
(я нахожусь на Tcl8.4 без возможности обновления из-за использования в среде коммерческих инструментов. Но ради этого сайта я бы также рекомендовал ответы для более современных версий tcl)