1

私は Lua のプリティ プリンターに取り組んでおり、関数構文のインデントの処理に行き詰まっています。

私が欲しいのはこれです:関数定義が十分に短い場合、すべての定義を1行で記述できますが、それほど短くない場合は、すべての本体を新しい行にインデントして印刷する必要があります。その後、endキーワードはインデントなしで新しい行に配置する必要があります。

Leijen pretty-printer がどのように機能するかを完全には理解していないと思いますが、これまでに得たものは次のとおりです。

import Text.PrettyPrint.Leijen
import System.IO (stdout)

sometext = text "short text" </> text "this is some long text at least long enough for my purposes"
p = parens (align (cat (punctuate (comma <> space) (map text ["first parameter", "second parameter", "third"]))))

doc3 = indent 4 (sep [text "function" </> p, indent 4 sometext, text "end"])

main :: IO ()
main = do
    displayIO stdout (renderPretty 1 133 (doc3 <$> line))
    displayIO stdout (renderPretty 1 134 (doc3 <$> line))
    displayIO stdout (renderPretty 1 40 (doc3 <$> line))

これは、出力の 2 番目の部分を除いて、実際にはかなりうまく機能します。

function (first parameter, second parameter, third)
    short text this is some long text at least long enough for my purposes
end

function (first parameter, second parameter, third)     short text this is some long text at least long enough for my purposes end

function (first parameter, 
          second parameter, 
          third)
    short text
    this is some long text at least long enough for my purposes
end

ここでは、2 番目の出力で 4 つのスペースのインデントは必要ありません。しかし、他の出力を台無しにすることなくそれを行う方法を見つけることができませんでした.

どんな助けでも大歓迎です。

編集: これは別のテストケースです:

doc4 = sep [ text "if" </> text "test" </> text "then"
           , indent 4 then_body
           , text "elseif" </> elseif_conditions </> text "then"
           , indent 4 elseif_body
           , text "end"
           ]

私が望むのは、出力が十分に短い場合、すべてを同じ行に出力することです(ただし、インデントスペースはありません)。複数の行を分割する場合はうまく機能しますが、同じ行に印刷する場合は余分なスペースを入れます。

4

1 に答える 1