0

私は、典型的な言語の文字列に何らかの構造をもたらしたい状況を見ています。そして、リボルのパーツボックスをどう使うか。

では、方言しようとしている元の言語で次のような行があるとします。

something = ("/foo/mumble" "/foo/${BAR}/baz")

Rebol のプリミティブを使いたいので、必ずファイル パスを指定します。これは、私が頭のてっぺんから考え出したランダムな例です。

something: [%/foo/mumble [%/foo/ BAR %/baz]]

コードの場合は、REJOIN または COMBINE を使用します。しかし、これは実行されるようには設計されておらず、構成ファイルに似ています。ファイルのリストを取得するだけで、任意のコードを実行することは想定されていません。

文字列に固執し、それでもこれらの型を FILE! として保持することがどれほど実現可能かはわかりません。すべての文字が FILE! で機能するわけではありません。たとえば、次のようになります。

>> load "%/foo/${BAR}/baz"
== [%/foo/$ "BAR" /baz]

構成ファイルを表すはずの Rebol データに、私のオプションがどのようなものがあるのか​​疑問に思います。普通の古い文字列を使用して、他のものと同じように置換を行うことができます。たぶん、環境を表すために OBJECT ブロックで REWORD しますか?

Rebol の「リワード」機能とは何ですか?また、どのように使用すればよいですか?

いずれにせよ、このような環境変数の置換を使用して、宣言的なコンテキストでファイル名を表す方法を知りたいです。

4

2 に答える 2

3

ファイルを使うべきです!あなたの例は % の後に "" が必要です

f: {%"/foo/${BAR}/baz"} を読み込みます

f "${BAR}" "MYVALUE" を置き換えます;== %/foo/MYVALUE/baz

于 2014-10-05T18:27:57.153 に答える
2

パスを使用できます!括弧付き。

唯一の問題はルートです。ファイルに使用される「%」を別の文字で置き換えることができます...「!」を使用しましょう。(これは「有効な文字」という単語である必要があることに注意してください)。

パス上で to-block を呼び出すとき! タイプ、それは各部分を独自のトークンとして返します...便利です。

to-block '!/path/(foo)/file.txt
== [! path (foo) file.txt]

これは、3 つのパスをロードし、パスの構成部分として括弧を使用し、タグを使用してパスの不正な文字 (スペースなど!) をエスケープする小さなスクリプトです。

environments: make object! [
    foo: "FU"
    bar: "BR"
]

paths: [
    !/path/(foo)/file.txt
    !/root/<escape weird chars $>/(bar ".txt")
    !/("__" foo)/path/(bar)
]

parse paths [
    some [
        (print "------" )       
        set data  path! here: ( insert/only here to-block data to-block data )
        (out-path: copy %"" )
        into [
            path-parts: (?? path-parts)
            '! 
            some [
                  [ set data [word! | tag! | number!] (
                    append out-path rejoin ["/" to-string data]
                  )]
                | 
                into [
                    ( append out-path "/")
                    some [
                          set data word! ( append out-path rejoin [to-string get in environments data] )
                        | set data skip ( append out-path rejoin [ to-string data])
                    ]
                ]
                | here: set data skip (to-error rejoin ["invalid path token (" type? data ") here: " mold here])
            ]
        ]
        (?? out-path)
    ]
]

これはRebol3とRebol2の両方で機能することに注意してください

出力は次のとおりです。

------
path-parts: [! path (foo) file.txt]
out-path: %/path/FU/file.txt
------
path-parts: [! root <escape weird chars $> (bar ".txt")]
out-path: %/root/escape%20weird%20chars%20$/BR.txt
------
path-parts: [! ("__" foo) path (bar)]
out-path: %/__FU/path/BR
------
于 2014-10-03T01:37:19.763 に答える