]> Repositorios git - scryer-prolog.git/commitdiff
ADDED: format specifier ~NL to limit the number of digits per line
authorMarkus Triska <[email protected]>
Mon, 10 Jan 2022 16:29:45 +0000 (17:29 +0100)
committerMarkus Triska <[email protected]>
Mon, 10 Jan 2022 16:52:42 +0000 (17:52 +0100)
Example:

    %?- format("~65L", [2^1000]).
    %@ 10715086071862673209484250490600018105614048117055336074437503883_
    %@ 70351051124936122493198378815695858127594672917553146825187145285_
    %@ 69231404359845775746985748039345677748242309854210746050623711418_
    %@ 77954182153046474983581941267398767559165543946077062914571196477_
    %@ 686542167660429831652624386837205668069376   true.

src/lib/format.pl

index e28ad05ea1095cdc10f7d4e5c5d2e93c3c026679..fd2a9816d4fdfced028a593cfbd0bfe11beed861 100644 (file)
@@ -29,6 +29,8 @@
      ~ND   like ~Nd, separating digits to the left of the decimal point
            in groups of three, using the character "," (comma)
      ~NU   like ~ND, using "_" (underscore) to separate groups of digits
+     ~NL   format an integer so that at most N digits appear on a line.
+           If N is 0 or omitted, it defaults to 72.
      ~Nr   where N is an integer between 2 and 36: format the
            next argument, which must be an integer, in radix N.
            The characters "a" to "z" are used for radices 10 to 36.
@@ -208,6 +210,16 @@ cells([~|Fs0], Args0, Tab, Es, VNs) -->
         !,
         { separate_digits_fractional(Arg, '_', Num, Cs) },
         cells(Fs, Args, Tab, [chars(Cs)|Es], VNs).
+cells([~|Fs0], Args0, Tab, Es, VNs) -->
+        { numeric_argument(Fs0, Num0, ['L'|Fs], Args0, [Arg|Args]) },
+        !,
+        { (   Num0 =:= 0 ->
+              Num = 72
+          ;   Num = Num0
+          ),
+          phrase(format_("~d", [Arg]), Cs0),
+          phrase(split_lines_width(Cs0, Num), Cs) },
+        cells(Fs, Args, Tab, [chars(Cs)|Es], VNs).
 cells([~,i|Fs], [_|Args], Tab, Es, VNs) --> !,
         cells(Fs, Args, Tab, Es, VNs).
 cells([~,n|Fs], Args, Tab, Es, VNs) --> !,
@@ -328,6 +340,14 @@ upto_what([], _) --> [].
 groups_of_three([A,B,C,D|Rs], Sep) --> !, [A,B,C,Sep], groups_of_three([D|Rs], Sep).
 groups_of_three(Ls, _) --> seq(Ls).
 
+split_lines_width(Cs, Num) -->
+        (   { length(Prefix, Num),
+              append(Prefix, [R|Rs], Cs) } ->
+            seq(Prefix), "_\n",
+            split_lines_width([R|Rs], Num)
+        ;   seq(Cs)
+        ).
+
 cell(From, To, Es0) -->
         (   { Es0 == [] } -> []
         ;   { reverse(Es0, Es) },