0

tcl C-API を (ab) 使用して文字列を「解析」し、すべての置換 (角括弧内のサブコマンドを含む) を実行し、結果のコマンドラインを実際に評価する前に停止する方法はありますか?

私がやろうとしているのは、パラメータとしてブロックを受け取るコマンドを作成することです (C で作成しますが、エレガントな方法があれば tcl-wrapper を検討します) (つまり、curly-braces-quoted -ストリング)。そのブロックを取得し、分割して、実行される場合と同じ方法で置換を実行したいのですが、そこで停止して、代わりに結果の行を解釈します。

すべての有効な最初の単語がコマンドとして定義されている名前空間を作成することを検討しましたが、このリストは非常に膨大で (そしてかなり動的)、すぐに扱いにくくなります。私もこのアプローチを試しましたがunknown、さまざまなコマンドをインターセプトするコマンドを使用しました。ただし、unknownはさまざまなものに使用され、名前空間にバインドできないため、ブロックを実行するたびに定義し、完了したら以前の状態に戻す必要があります。揺れる。その上、実際のコマンドと衝突するリスク (かなり低いリスクですが、ゼロではない) を実行するので、コマンドを使用しないことを非常に好みunknownます。

私が得ることができる最も近いものはTcl_ParseCommand、(およびファミリーの残りの部分)であり、手動で評価できる解析ツリーを生成します。より良い解決策がない場合は、この方法に頼ると思いますが、「公式の」方法があれば、もちろんそれを好むでしょう..

何か不足していますか?

4

1 に答える 1

2

Tcl_SubstObjを見てください。これは、探しているもののように見える [subst] コマンドに相当する C です。

コメントで示したように、 subst はあなたがやりたいことを完全には実行しません。それが役立つ場合は、次の Tcl コードが探しているものである可能性があります。

> set mydata {mylist item $listitem group item {$group item}}
> set listitem {1 2 3}
> subst $mydata      ;# error: can't read "group": no such variable
> proc groupsubst {data} {
    return [uplevel 1 list $data]
}
> groupsubst $mydata ;# mylist item {1 2 3} group item {$group item}
于 2009-10-21T17:28:34.643 に答える