我如何漂亮地打印一个 Erlang 术语以使其可读?
How do I prettyprint an Erlang term to make it readable?
假设我有这个 Erlang 术语:
{{badmatch,{error,enoent}},[{ts_config_http,parse_config,2,[{file,"src/tsung_controller/ts_config_http.erl"},{line,63}]},{lists,foldl,3,[{file,"lists.erl"},{line,1261}]},{ts_config,parse,2,[{file,"src/tsung_controller/ts_config.erl"},{line,437}]},{lists,foldl,3,[{file,"lists.erl"},{line,1261}]},{ts_config,handle_read,3,[{file,"src/tsung_controller/ts_config.erl"},{line,85}]},{ts_config,read,2,[{file,"src/tsung_controller/ts_config.erl"},{line,70}]},{ts_config_server,handle_call,3,[{file,"src/tsung_controller/ts_config_server.erl"},{line,206}]},{gen_server,try_handle_call,4,[{file,"gen_server.erl"},{line,607}]}]}
我如何将这个术语漂亮地打印到宽度 80?
我会将术语保存为 Term
,然后使用 format/1
打印它。
1> Term = {{badmatch,{error,enoent}},[{ts_config_http,parse_config,2,[{file,..}
2> io:format("~80p~n", [Term]).
{{badmatch,{error,enoent}},
[{ts_config_http,parse_config,2,
[{file,"src/tsung_controller/ts_config_http.erl"},
{line,63}]},
{lists,foldl,3,[{file,"lists.erl"},{line,1261}]},
{ts_config,parse,2,[{file,"src/tsung_controller/ts_config.erl"},{line,437}]},
{lists,foldl,3,[{file,"lists.erl"},{line,1261}]},
{ts_config,handle_read,3,
[{file,"src/tsung_controller/ts_config.erl"},{line,85}]},
{ts_config,read,2,[{file,"src/tsung_controller/ts_config.erl"},{line,70}]},
{ts_config_server,handle_call,3,
[{file,"src/tsung_controller/ts_config_server.erl"},
{line,206}]},
{gen_server,try_handle_call,4,[{file,"gen_server.erl"},{line,607}]}]}
您可以使用 rp
:
1> f(Ds), Ds = [{beside,{beside,{beside,{text," something"},{beside,{text,[1,58]},{text," very_long"}}},{text,[1,40]}},{beside,{sep,[{beside,{text,[5,98,97,115,101,100]},{float,{text,[1,44]},0,0}},{beside,{text,[2,111,110]},{float,{text,[1,44]},0,0}},{beside,{text,[7,80,114,101,100,79,110,101]},{float,{text,[1,44]},0,0}},{text,"6\"1231231231231231313123123132sfsafsasfasdfasdfasdfsdf\""}],0,false},{float,{text,[1,41]},0,0}}},{float,{text,[7,97,110,100,97,108,115,111]},0,0},{text,[7,80,114,101,100,84,119,111]},{float,{text,[7,97,110,100,97,108,115,111]},0,0},{sep,[{text,[6,65,86,97,108,117,101]},{float,{text,[3,61,58,61]},0,0},{text," something"}],4,true},{float,{text,[7,97,110,100,97,108,115,111]},0,0},{above,{beside,{beside,{text," something"},{beside,{text,[1,58]},{text,[11,112,111,116,101,110,116,105,97,108,108,121]}}},{text,[1,40]}},{nest,4,{beside,{sep,[{above,{beside,{beside,{text,[4,118,101,114,121]},{beside,{text,[1,58]},{text,[4,108,111,110,103]}}},{text,[1,40]}},{nest,4,{beside,{sep,[{beside,{beside,{beside,{text,[4,116,104,97,116]},{beside,{text,[1,58]},{text,[5,110,101,101,100,115]}}},{text,[1,40]}},{beside,{sep,[{text," indenting"}],0,false},{float,{text,[1,41]},0,0}}}],0,false},{float,{text,[1,41]},0,0}}}}],0,false},{float,{text,[1,41]},0,0}}}}].
[{beside,{beside,{beside,{text," something"},
{beside,{text,[1,58]},{text," very_long"}}},
{text,[1,40]}},
{beside,{sep,[{beside,{text,[5,98,97,115,101,100]},
{float,{text,[1,44]},0,0}},
{beside,{text,[2,111,110]},{float,{text,[1,44]},0,0}},
{beside,{text,[7,80,114,101,100,79,110,101]},
{float,{text,[1,44]},0,0}},
{text,"6\"1231231231231231313123123132sfsafsasfasdfasdfasdfsdf\""}],
0,false},
{float,{text,[1,41]},0,0}}},
{float,{text,[7,97,110,100,97,108,115,111]},0,0},
{text,[7,80,114,101,100,84,119,111]},
{float,{text,[7,97,110,100,97,108,115,111]},0,0},
{sep,[{text,[6,65,86,97,108,117,101]},
{float,{text,[3,61,58,61]},0,0},
{text," something"}],
4,true},
{float,{text,[7,97,110,100,97,108,115,111]},0,0},
{above,{beside,{beside,{text," something"},
{beside,{text,[1,58]},{text,"\vpotentially"}}},
{text,[1,40]}},
{nest,4,
{beside,{sep,[{above,{beside,{beside,{text,[4,118,101|...]},
{beside,{text,[...]},{text,...}}},
{text,[1,40]}},
{nest,4,{beside,{sep,[{...}],0,...},{float,{...},...}}}}],
0,false},
{float,{text,[1,41]},0,0}}}}]
2> rp(Ds).
[{beside,{beside,{beside,{text," something"},
{beside,{text,[1,58]},{text," very_long"}}},
{text,[1,40]}},
{beside,{sep,[{beside,{text,[5,98,97,115,101,100]},
{float,{text,[1,44]},0,0}},
{beside,{text,[2,111,110]},{float,{text,[1,44]},0,0}},
{beside,{text,[7,80,114,101,100,79,110,101]},
{float,{text,[1,44]},0,0}},
{text,"6\"1231231231231231313123123132sfsafsasfasdfasdfasdfsdf\""}],
0,false},
{float,{text,[1,41]},0,0}}},
{float,{text,[7,97,110,100,97,108,115,111]},0,0},
{text,[7,80,114,101,100,84,119,111]},
{float,{text,[7,97,110,100,97,108,115,111]},0,0},
{sep,[{text,[6,65,86,97,108,117,101]},
{float,{text,[3,61,58,61]},0,0},
{text," something"}],
4,true},
{float,{text,[7,97,110,100,97,108,115,111]},0,0},
{above,{beside,{beside,{text," something"},
{beside,{text,[1,58]},{text,"\vpotentially"}}},
{text,[1,40]}},
{nest,4,
{beside,{sep,[{above,{beside,{beside,{text,[4,118,101,114,
121]},
{beside,{text,[1,58]},{text,[4,108,111,110,103]}}},
{text,[1,40]}},
{nest,4,
{beside,{sep,[{beside,{beside,{beside,{text,[4,116,104,97,
116]},
{beside,{text,[1,58]},{text,[5,110,101,101,100,115]}}},
{text,[1,40]}},
{beside,{sep,[{text," indenting"}],0,false},
{float,{text,[1,41]},0,0}}}],
0,false},
{float,{text,[1,41]},0,0}}}}],
0,false},
{float,{text,[1,41]},0,0}}}}]
ok
3>
更重要的是,如果将它与 rr/1
结合使用,您可以获得更好的结果......
3> rr(prettypr).
[above,beside,c_above_nest,c_beside,c_best_nest,
c_best_nest_or,c_fit,c_float_above_nest,c_float_beside,
c_sep_nest,c_text_beside,fit,float,nest,sep,text,union]
4> rp(Ds).
[#beside{
d1 =
#beside{
d1 =
#beside{
d1 = #text{s = " something"},
d2 =
#beside{
d1 = #text{s = [1,58]},
d2 = #text{s = " very_long"}}},
d2 = #text{s = [1,40]}},
d2 =
#beside{
d1 =
#sep{
ds =
[#beside{
d1 = #text{s = [5,98,97,115,101,100]},
d2 = #float{d = #text{s = [1,44]},h = 0,v = 0}},
#beside{
d1 = #text{s = [2,111,110]},
d2 = #float{d = #text{s = [1,44]},h = 0,v = 0}},
#beside{
d1 = #text{s = [7,80,114,101,100,79,110,101]},
d2 = #float{d = #text{s = [1,44]},h = 0,v = 0}},
#text{
s = "6\"1231231231231231313123123132sfsafsasfasdfasdfasdfsdf\""}],
i = 0,p = false},
d2 = #float{d = #text{s = [1,41]},h = 0,v = 0}}},
#float{
d = #text{s = [7,97,110,100,97,108,115,111]},
h = 0,v = 0},
#text{s = [7,80,114,101,100,84,119,111]},
#float{
d = #text{s = [7,97,110,100,97,108,115,111]},
h = 0,v = 0},
#sep{
ds =
[#text{s = [6,65,86,97,108,117,101]},
#float{d = #text{s = [3,61,58,61]},h = 0,v = 0},
#text{s = " something"}],
i = 4,p = true},
#float{
d = #text{s = [7,97,110,100,97,108,115,111]},
h = 0,v = 0},
#above{
d1 =
#beside{
d1 =
#beside{
d1 = #text{s = " something"},
d2 =
#beside{
d1 = #text{s = [1,58]},
d2 = #text{s = "\vpotentially"}}},
d2 = #text{s = [1,40]}},
d2 =
#nest{
n = 4,
d = #beside{
d1 =
#sep{
ds =
[#above{
d1 =
#beside{
d1 =
#beside{
d1 = #text{s = [4,118,101,114,121]},
d2 =
#beside{
d1 = #text{s = [1,58]},
d2 = #text{s = [4,108,111,110,103]}}},
d2 = #text{s = [1,40]}},
d2 =
#nest{
n = 4,
d = #beside{
d1 =
#sep{
ds =
[#beside{
d1 =
#beside{
d1 =
#beside{
d1 = #text{s = [4,116,104,97,116]},
d2 =
#beside{
d1 = #text{s = [1,58]},
d2 = #text{s = [5,110,101,101,100,115]}}},
d2 = #text{s = [1,40]}},
d2 =
#beside{
d1 = #sep{ds = [#text{s = " indenting"}],i = 0,p = false},
d2 = #float{d = #text{s = [1,41]},h = 0,v = 0}}}],
i = 0,p = false},
d2 = #float{d = #text{s = [1,41]},h = 0,v = 0}}}}],
i = 0,p = false},
d2 = #float{d = #text{s = [1,41]},h = 0,v = 0}}}}]
ok
5>
假设我有这个 Erlang 术语:
{{badmatch,{error,enoent}},[{ts_config_http,parse_config,2,[{file,"src/tsung_controller/ts_config_http.erl"},{line,63}]},{lists,foldl,3,[{file,"lists.erl"},{line,1261}]},{ts_config,parse,2,[{file,"src/tsung_controller/ts_config.erl"},{line,437}]},{lists,foldl,3,[{file,"lists.erl"},{line,1261}]},{ts_config,handle_read,3,[{file,"src/tsung_controller/ts_config.erl"},{line,85}]},{ts_config,read,2,[{file,"src/tsung_controller/ts_config.erl"},{line,70}]},{ts_config_server,handle_call,3,[{file,"src/tsung_controller/ts_config_server.erl"},{line,206}]},{gen_server,try_handle_call,4,[{file,"gen_server.erl"},{line,607}]}]}
我如何将这个术语漂亮地打印到宽度 80?
我会将术语保存为 Term
,然后使用 format/1
打印它。
1> Term = {{badmatch,{error,enoent}},[{ts_config_http,parse_config,2,[{file,..}
2> io:format("~80p~n", [Term]).
{{badmatch,{error,enoent}},
[{ts_config_http,parse_config,2,
[{file,"src/tsung_controller/ts_config_http.erl"},
{line,63}]},
{lists,foldl,3,[{file,"lists.erl"},{line,1261}]},
{ts_config,parse,2,[{file,"src/tsung_controller/ts_config.erl"},{line,437}]},
{lists,foldl,3,[{file,"lists.erl"},{line,1261}]},
{ts_config,handle_read,3,
[{file,"src/tsung_controller/ts_config.erl"},{line,85}]},
{ts_config,read,2,[{file,"src/tsung_controller/ts_config.erl"},{line,70}]},
{ts_config_server,handle_call,3,
[{file,"src/tsung_controller/ts_config_server.erl"},
{line,206}]},
{gen_server,try_handle_call,4,[{file,"gen_server.erl"},{line,607}]}]}
您可以使用 rp
:
1> f(Ds), Ds = [{beside,{beside,{beside,{text," something"},{beside,{text,[1,58]},{text," very_long"}}},{text,[1,40]}},{beside,{sep,[{beside,{text,[5,98,97,115,101,100]},{float,{text,[1,44]},0,0}},{beside,{text,[2,111,110]},{float,{text,[1,44]},0,0}},{beside,{text,[7,80,114,101,100,79,110,101]},{float,{text,[1,44]},0,0}},{text,"6\"1231231231231231313123123132sfsafsasfasdfasdfasdfsdf\""}],0,false},{float,{text,[1,41]},0,0}}},{float,{text,[7,97,110,100,97,108,115,111]},0,0},{text,[7,80,114,101,100,84,119,111]},{float,{text,[7,97,110,100,97,108,115,111]},0,0},{sep,[{text,[6,65,86,97,108,117,101]},{float,{text,[3,61,58,61]},0,0},{text," something"}],4,true},{float,{text,[7,97,110,100,97,108,115,111]},0,0},{above,{beside,{beside,{text," something"},{beside,{text,[1,58]},{text,[11,112,111,116,101,110,116,105,97,108,108,121]}}},{text,[1,40]}},{nest,4,{beside,{sep,[{above,{beside,{beside,{text,[4,118,101,114,121]},{beside,{text,[1,58]},{text,[4,108,111,110,103]}}},{text,[1,40]}},{nest,4,{beside,{sep,[{beside,{beside,{beside,{text,[4,116,104,97,116]},{beside,{text,[1,58]},{text,[5,110,101,101,100,115]}}},{text,[1,40]}},{beside,{sep,[{text," indenting"}],0,false},{float,{text,[1,41]},0,0}}}],0,false},{float,{text,[1,41]},0,0}}}}],0,false},{float,{text,[1,41]},0,0}}}}].
[{beside,{beside,{beside,{text," something"},
{beside,{text,[1,58]},{text," very_long"}}},
{text,[1,40]}},
{beside,{sep,[{beside,{text,[5,98,97,115,101,100]},
{float,{text,[1,44]},0,0}},
{beside,{text,[2,111,110]},{float,{text,[1,44]},0,0}},
{beside,{text,[7,80,114,101,100,79,110,101]},
{float,{text,[1,44]},0,0}},
{text,"6\"1231231231231231313123123132sfsafsasfasdfasdfasdfsdf\""}],
0,false},
{float,{text,[1,41]},0,0}}},
{float,{text,[7,97,110,100,97,108,115,111]},0,0},
{text,[7,80,114,101,100,84,119,111]},
{float,{text,[7,97,110,100,97,108,115,111]},0,0},
{sep,[{text,[6,65,86,97,108,117,101]},
{float,{text,[3,61,58,61]},0,0},
{text," something"}],
4,true},
{float,{text,[7,97,110,100,97,108,115,111]},0,0},
{above,{beside,{beside,{text," something"},
{beside,{text,[1,58]},{text,"\vpotentially"}}},
{text,[1,40]}},
{nest,4,
{beside,{sep,[{above,{beside,{beside,{text,[4,118,101|...]},
{beside,{text,[...]},{text,...}}},
{text,[1,40]}},
{nest,4,{beside,{sep,[{...}],0,...},{float,{...},...}}}}],
0,false},
{float,{text,[1,41]},0,0}}}}]
2> rp(Ds).
[{beside,{beside,{beside,{text," something"},
{beside,{text,[1,58]},{text," very_long"}}},
{text,[1,40]}},
{beside,{sep,[{beside,{text,[5,98,97,115,101,100]},
{float,{text,[1,44]},0,0}},
{beside,{text,[2,111,110]},{float,{text,[1,44]},0,0}},
{beside,{text,[7,80,114,101,100,79,110,101]},
{float,{text,[1,44]},0,0}},
{text,"6\"1231231231231231313123123132sfsafsasfasdfasdfasdfsdf\""}],
0,false},
{float,{text,[1,41]},0,0}}},
{float,{text,[7,97,110,100,97,108,115,111]},0,0},
{text,[7,80,114,101,100,84,119,111]},
{float,{text,[7,97,110,100,97,108,115,111]},0,0},
{sep,[{text,[6,65,86,97,108,117,101]},
{float,{text,[3,61,58,61]},0,0},
{text," something"}],
4,true},
{float,{text,[7,97,110,100,97,108,115,111]},0,0},
{above,{beside,{beside,{text," something"},
{beside,{text,[1,58]},{text,"\vpotentially"}}},
{text,[1,40]}},
{nest,4,
{beside,{sep,[{above,{beside,{beside,{text,[4,118,101,114,
121]},
{beside,{text,[1,58]},{text,[4,108,111,110,103]}}},
{text,[1,40]}},
{nest,4,
{beside,{sep,[{beside,{beside,{beside,{text,[4,116,104,97,
116]},
{beside,{text,[1,58]},{text,[5,110,101,101,100,115]}}},
{text,[1,40]}},
{beside,{sep,[{text," indenting"}],0,false},
{float,{text,[1,41]},0,0}}}],
0,false},
{float,{text,[1,41]},0,0}}}}],
0,false},
{float,{text,[1,41]},0,0}}}}]
ok
3>
更重要的是,如果将它与 rr/1
结合使用,您可以获得更好的结果......
3> rr(prettypr).
[above,beside,c_above_nest,c_beside,c_best_nest,
c_best_nest_or,c_fit,c_float_above_nest,c_float_beside,
c_sep_nest,c_text_beside,fit,float,nest,sep,text,union]
4> rp(Ds).
[#beside{
d1 =
#beside{
d1 =
#beside{
d1 = #text{s = " something"},
d2 =
#beside{
d1 = #text{s = [1,58]},
d2 = #text{s = " very_long"}}},
d2 = #text{s = [1,40]}},
d2 =
#beside{
d1 =
#sep{
ds =
[#beside{
d1 = #text{s = [5,98,97,115,101,100]},
d2 = #float{d = #text{s = [1,44]},h = 0,v = 0}},
#beside{
d1 = #text{s = [2,111,110]},
d2 = #float{d = #text{s = [1,44]},h = 0,v = 0}},
#beside{
d1 = #text{s = [7,80,114,101,100,79,110,101]},
d2 = #float{d = #text{s = [1,44]},h = 0,v = 0}},
#text{
s = "6\"1231231231231231313123123132sfsafsasfasdfasdfasdfsdf\""}],
i = 0,p = false},
d2 = #float{d = #text{s = [1,41]},h = 0,v = 0}}},
#float{
d = #text{s = [7,97,110,100,97,108,115,111]},
h = 0,v = 0},
#text{s = [7,80,114,101,100,84,119,111]},
#float{
d = #text{s = [7,97,110,100,97,108,115,111]},
h = 0,v = 0},
#sep{
ds =
[#text{s = [6,65,86,97,108,117,101]},
#float{d = #text{s = [3,61,58,61]},h = 0,v = 0},
#text{s = " something"}],
i = 4,p = true},
#float{
d = #text{s = [7,97,110,100,97,108,115,111]},
h = 0,v = 0},
#above{
d1 =
#beside{
d1 =
#beside{
d1 = #text{s = " something"},
d2 =
#beside{
d1 = #text{s = [1,58]},
d2 = #text{s = "\vpotentially"}}},
d2 = #text{s = [1,40]}},
d2 =
#nest{
n = 4,
d = #beside{
d1 =
#sep{
ds =
[#above{
d1 =
#beside{
d1 =
#beside{
d1 = #text{s = [4,118,101,114,121]},
d2 =
#beside{
d1 = #text{s = [1,58]},
d2 = #text{s = [4,108,111,110,103]}}},
d2 = #text{s = [1,40]}},
d2 =
#nest{
n = 4,
d = #beside{
d1 =
#sep{
ds =
[#beside{
d1 =
#beside{
d1 =
#beside{
d1 = #text{s = [4,116,104,97,116]},
d2 =
#beside{
d1 = #text{s = [1,58]},
d2 = #text{s = [5,110,101,101,100,115]}}},
d2 = #text{s = [1,40]}},
d2 =
#beside{
d1 = #sep{ds = [#text{s = " indenting"}],i = 0,p = false},
d2 = #float{d = #text{s = [1,41]},h = 0,v = 0}}}],
i = 0,p = false},
d2 = #float{d = #text{s = [1,41]},h = 0,v = 0}}}}],
i = 0,p = false},
d2 = #float{d = #text{s = [1,41]},h = 0,v = 0}}}}]
ok
5>