0

string_concat を使用する場合、swipl でバックスラッシュをエスケープしたいと考えています。

シナリオ1-

string_concat('stack', ' overflow', Result).
Result = "stack overflow" 

シナリオ 2-

string_concat('stack', ' \=overflow', Result).
Syntax error: Undefined character escape in quoted atom or string: `\='

シナリオ3-

string_concat('stack', ' \\=overflow', Result).
Result = "stack \\=overflow" 

これで、シナリオ 1 は期待どおりに動作します。シナリオ 2 で説明した状況に直面しています。ここでは、バックスラッシュとイコールを含む文字列を連結する必要があります。つまり、string1 にはテキストのみが含まれ、string2 には \= を含むテキストが含まれており、結果は string1 と string2 が連結されたものになります。ただし、シナリオ 2 のように \= だけを使用すると、シーケンスをエスケープするように求めるエラーが発生します。ここで、シナリオ 3 のようにエスケープすると、2 つのバックスラッシュと等号が表示されます。2 つのバックスラッシュは必要ありません。

私の出力は正確になるはずですstack \=overflow。ここに欠けているエスケープシーケンスまたはメソッドはありますか?

ありがとう!

4

1 に答える 1

1

二重のバックスラッシュは表示のためだけにあります:

?- string_concat(stack, ' \\=overflow', X), writeln(X).
stack \=overflow
X = "stack \\=overflow".

ただし、このフラグを使用して動作を変更できます。

?- set_prolog_flag(character_escapes,false).
true.

?- writeln('stack \=overflow').
stack \=overflow
true.

デフォルト値trueでは、あなたが報告したエラーが表示されます:

?- set_prolog_flag(character_escapes,true).
true.

?- writeln('stack \=overflow').
ERROR: Syntax error: Undefined character escape in quoted atom or string: `\='
ERROR: writeln('stack \
ERROR: ** here **
ERROR: =overflow') . 

とにかく、完了したらその値をデフォルトにリセットするか、リテラルに対する望ましくない副作用についてSWを再確認する必要があると思います。

HTH

于 2012-09-16T07:28:53.717 に答える