Concurrent Clean : 汎用クォート関数
というユーティリティ関数を思いついたので、作ってみた。
//quote quote_char escape_char bare_string -> quoted_string quote :: !Char !Char !String -> String quote q e s0 # s1 = createArray (2 + newSize 0 0) '\0' = copyQuote s1 where l0 = size s0 newSize p l | p >= l0 = l | c == q || c == e = newSize (inc p) (l + 2) = newSize (inc p) (inc l) where c = s0.[p] copyQuote s1 # (l1, s1) = usize s1 s1 = update s1 0 q s1 = update s1 (l1 - 1) q = copyEscape 0 1 s1 where copyEscape p0 p1 s1 | p0 >= l0 = s1 | c == q || c == e # s1 = update s1 p1 e p1 = inc p1 s1 = update s1 p1 c = copyEscape (inc p0) (inc p1) s1 # s1 = update s1 p1 c = copyEscape (inc p0) (inc p1) s1 where c = s0.[p0] d_quote :== quote '"' '\\' s_quote :== quote '\'' '\''
動作確認
Start = (d_quote "aa\"bb\\cc\'dd" ,s_quote "aa\"bb\\cc\'dd" )
結果
(""aa\"bb\\cc'dd"","'aa"bb\cc''dd'")
まずまず便利そうだ。