локальные процедуры в TCL

Я хочу создать процедуру, которая существует только в рамках другого процесса в TCL.
Т.е. что только 1 прок может это вызвать. Является ли это возможным? Согласно этой следующей ссылке, нет. :http://wiki.tcl.tk/463
Но, может быть, кто-то знает другой способ сделай это.
Спасибо.


person user1134991    schedule 03.11.2017    source источник


Ответы (2)


Вы не можете ограничить такие процедуры, но вы можете использовать термин лямбда, который почти так же хорош:

proc outside {a b c} {
    # Lambda terms are two- or three-element lists.
    set inside {{d e f} {
        return [expr {$d + $e * $f}]
    }}

    set total 0
    for {set i $a} {$i < $b} {incr i} {
        # Lambdas have to be explicitly applied with [apply]
        set total [apply $inside $total $c $i]
    }
    return $total
}

puts [outside 3 7 18]

Первый элемент лямбда: список формальных аргументов (как для proc)
Второй элемент лямбда: тело (как для proc)
Третий НЕОБЯЗАТЕЛЬНЫЙ элемент лямбда: контекстное пространство имен, по умолчанию глобальное пространство имен (::)

person Donal Fellows    schedule 03.11.2017

Философия Tcl позволяет, а не ограничивает. Программисту доверяют делать правильные вещи.

Можно использовать пространства имен, псевдонимы одного и того же интерпретатора или объектно-ориентированные программы для мягкого ограничения процедур. Они не могут быть вызваны по ошибке, но к ним можно получить доступ путем преднамеренного действия. Процедуры модуля часто ограничиваются таким образом: посмотрите код, например. struct::matrix чтобы посмотреть, как это можно сделать.

Можно можно жестко ограничить процедуры, запустив программу в песочнице, интерпретаторе, который полностью скрывает процедуру или разрешает ее вызов только при особых обстоятельствах, например, если она вызывается из определенной процедуры.

(Можно также написать процедуру, которая просто проверяет, кто вызывающий абонент, но ее легко подделать.)

Ограничение доступа к процедуре путем создания локального идентификатора — это функция лексической области видимости, которую Tcl не использует. Ближайший соответствующий механизм — пространства имен.

person Peter Lewerin    schedule 03.11.2017