Почему следующий скрипт tcl для NS2 выдает ошибку при выполнении процедуры?

Я очень наивен в использовании NS2 и пытался реализовать CBR через UDP в NS2. Я написал следующий код:

set ns [new Simulator]
set tracefile [open out.tr w]
$ns trace-all $tracefile
set nf [open out.nam w]
$ns namtrace-all $nf

#should be "proc name args body"
#while executing
#"proc finish {}"

proc finish {}
{
global ns tracefile nf
    $ns flush-trace
    close $nf
    close $tracefile
    exec nam out.nam &
    exit 0
}
set n0 [$ns node]
set n1 [$ns node]
$ns simplex-link $n0 $n1 1Mb 10ms DropTail
set udp0 [new Agent/UDP]
$ns attach-agent $n0 $udp0
set cbr[new Application/Traffic/CBR]
$cbr attach-agent $udp0
set null0 [new Agent/Null]
$ns attach-agent $n1 $null0
$ns connect $udp0 $null0
$ns at 1.0 "$cbr start"
$ns at 3.0 "finish"
$ns run

Отображаемая ошибка комментируется над процедурой завершения процесса. Пробовал искать ошибки, но не нашел. То, что я сделал, написано как сценарий Tcl и для выполнения ns filename.tcl для запуска.


person Kavish Dwivedi    schedule 12.05.2013    source источник


Ответы (1)


Tcl как язык рассматривает новую строку как значимую; он отмечает конец последовательности слов, формирующих вызов команды. Поскольку proc на самом деле просто обычная команда Tcl (которая создает команды с использованием скрипта в качестве реализации), а не какой-то специальный синтаксис, если вы сделаете:

proc finish {}

Затем вы предоставляете proc аргументов на один меньше, чем требуется в соответствии с его определением. В этот момент он жалуется, и эта жалоба и есть то, что вы наблюдали. (proc не знает, что вы решили поместить слово, которое хотите использовать в качестве тела скрипта, на следующей строке; это уровень хитрости, которого Tcl явно избегает из соображений политики, поскольку Tcl не имеет особых синтаксических формы вообще)

Чтобы исправить это, напишите свой код, используя стиль «одна настоящая фигурная скобка». , что настоятельно рекомендуется в Tcl:

proc finish {} {
    # put the body in here
}

В противном случае вы можете использовать обратную косую черту, чтобы писать по-другому:

proc finish {} \
{
    # body...
}

Однако вряд ли кто-то из тклеров поддерживает это. (В конце концов, это требует большего набора текста.)

person Donal Fellows    schedule 12.05.2013
comment
То же самое относится и к if {...} then {...} else {...}. - person Johannes Kuhn; 12.05.2013
comment
@JohannesKuhn Да, и while {…} {…}, и for …, и… ну, все. - person Donal Fellows; 12.05.2013