1

以下のスクリプトでどのように実装できますかexpand(tclで通常どおりコマンドと変数を拡張します)、出力したいのですが:

'
    hello {
        $b
    }
    {tcl world}
'

これは私がスクリプトがどのように見えるかを想像する方法です:

proc clever_func {script} {
    set script [uplevel 1 expand [list $script]]
    puts "'$script'"
}

proc isolated_client_function {} {
    set a hello
    set b difficult
    set c tcl
    set d world

    clever_func {
        $a {
            $b
        }
        [list $c $d]
    }
}

isolated_client_function
4

2 に答える 2

2

例は仕様を十分に置き換えるものではありませんが、必要なことを実行する組み込みのTCL機能がないようです。1つのコマンドテールで置換を実行することは可能ですが(listコマンドの前に追加evalして任意のレベルで実行することにより)、2つの「コマンド」を含む疑似スクリプトでは実行できません。(を使用して文字列補間が行うことを行うことも可能substですが、おそらくそれがあなたが望むものではない理由をすでに知っているでしょう:それはまた拡張します$b)。

私はあなたが望むものを手に入れるために2つの可能性を見ます:

  1. を使用して入力をsugar::scriptToListトークン化し、トークンのリストで手動で置換を実行してから、結果を。を使用してテキスト形式に変換し直しsugar::listToScriptます。マクロプロセッサのこれらの機能は、sugarフォーマット、コメント、およびレイアウトを維持しながら、スクリプトをセマンティックに変更できるように設計されています。

  2. 入力を個別の「コマンド」に分割します。最初に各改行とセミコロンで分割し、次にinfo complete完全な「コマンド」に対応する部分を収集するために使用します(IIRCではバックスラッシュ-改行の継続を伴ういくつかのコーナーケースがあります:注意してください)。"list "完全な「コマンド」ごとに、必要なコンテキスト()で結果を評価し、先頭に追加するトリックを使用しますuplevel。したがって、コマンドごとに、適切なときに置換がすでに実行されているリストが表示されます。各「コマンド」内のフォーマットのニュアンス(単語を区切るスペースの数やスペースの種類など)が失われ、自分で覚えていない限り、元のコマンドセパレーターが失われます。ある種の「eval後で他のコンテキストで使用されます。

于 2013-02-09T20:39:54.140 に答える
1

このsubstコマンドは、ほとんどの方法でそこに移動します。

proc expand {script} {
    uplevel 1 [list subst $script]
}

set a hello
set b difficult
set c tcl
set d world

expand {
    $a {
        $b
    }
    [list $c $d]
}

出力

    hello {
        difficult
    }
    tcl world

$b頭のてっぺんから、代用を防ぐ方法がわかりません。おそらく、スクリプトを自分で解析する必要があります。

最後の部分にあなたが示す引用を持たせたい場合は、別のレベルのリストネスが必要です

expand {
    $a {
        $b
    }
    [list [list $c $d]]
}

出力

    hello {
        difficult
    }
    {tcl world}
于 2013-02-10T01:39:54.580 に答える