2017-11-03 5 views
0

私は、TCL内の別のプロシージャのスコープ内にのみ存在するプロシージャを作成したいと考えています。
I. 1つのprocだけで呼び出すことができます。出来ますか?この次のリンクによると、 :http://wiki.tcl.tk/463
しかし、誰かがそれを行う別の方法を知っているかもしれません。
ありがとうございます。TCLのローカルプロシージャ

答えて

0

Tclの哲学は、制限するのではなく有効にしています。プログラマは正しいことをすることが信頼されています。

名前空間、同じインタプリタエイリアス、またはOOをソフト制限手順に使用できます。間違って呼び出すことはできませんが、意図的な操作でもアクセスできます。モジュール手続きはしばしば以下のように制限されている。 struct::matrixを参照してください。

サンドボックス内でプログラムを実行することによってハード制限する手順は、プロシージャを完全に保留するか、特定の手順から呼び出された場合など、特殊な状況下でのみ呼び出すことができます。その識別子は、ローカルにすることにより手続きへのアクセスを制限する

(一つは、単にチェックし、呼び出し元があるが、それは偽装するのは簡単です手順を書くことができます。)

はTclのdoesnの、レキシカルスコープの機能です使用しないでください。最も近い対応するメカニズムは名前空間です。

1

あなたはそのような手続きを制限することはできませんが、ほぼ同じ良いですラムダ項を使用することができます:ラムダの

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用など)、仮引数のリストを
セカンドlambda:bodyの要素(procの場合)
ラムダ:コンテキスト名前空間の第3のオプション要素。グローバル名前空間のデフォルト値(::