Thread overview
Formatted output ranges
Apr 11, 2015
Dennis Ritchie
Apr 11, 2015
anonymous
Apr 11, 2015
Dennis Ritchie
Apr 11, 2015
Dennis Ritchie
Apr 12, 2015
Dennis Ritchie
Apr 17, 2015
Ivan Kazmenko
Apr 17, 2015
Dennis Ritchie
Apr 20, 2015
Ivan Kazmenko
Apr 20, 2015
Dennis Ritchie
April 11, 2015
Hi,
Is it possible to write somehow shorter using formatted output and other library functions?

-----
import std.stdio, std.range;

void main() {

	auto a = iota(100, 201);

	writefln("%(;; %(%s, %),\n%).", [
		a[0 .. 15],
		a[15 .. 30],
		a[30 .. 45],
		a[45 .. 60],
		a[60 .. 75],
		a[75 .. 90],
		a[90 .. $]
	]);
}
-----
;; 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
;; 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
;; 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144,
;; 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
;; 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
;; 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
;; 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200.
April 11, 2015
On Saturday, 11 April 2015 at 20:10:49 UTC, Dennis Ritchie wrote:
> 	writefln("%(;; %(%s, %),\n%).", [
> 		a[0 .. 15],
> 		a[15 .. 30],
> 		a[30 .. 45],
> 		a[45 .. 60],
> 		a[60 .. 75],
> 		a[75 .. 90],
> 		a[90 .. $]
> 	]);

writefln("%(;; %(%s, %),\n%).", a.chunks(15));
April 11, 2015
On Saturday, 11 April 2015 at 20:37:17 UTC, anonymous wrote:
> On Saturday, 11 April 2015 at 20:10:49 UTC, Dennis Ritchie wrote:
>> 	writefln("%(;; %(%s, %),\n%).", [
>> 		a[0 .. 15],
>> 		a[15 .. 30],
>> 		a[30 .. 45],
>> 		a[45 .. 60],
>> 		a[60 .. 75],
>> 		a[75 .. 90],
>> 		a[90 .. $]
>> 	]);
>
> writefln("%(;; %(%s, %),\n%).", a.chunks(15));

Thanks.
April 11, 2015
I also want to know whether it is possible to D somehow set the maximum width of the print string in characters?

-----
void main() {
	import std.stdio, std.range;
	writefln(";; %(%s, %)).", iota(10, 1101));
}
-----

For example, here's the code to Common Lisp which is given by the width of the line is 30 characters:
-----
(let ((a (loop :for i :from 10 :to 1100 :collect i)))
	(format t "~%;;~{ ~<~%;; ~1,30:;~S~>~^,~}.~%" a))
-----
http://ideone.com/hGguge
April 12, 2015
On Saturday, 11 April 2015 at 22:45:39 UTC, Dennis Ritchie wrote:
> I also want to know whether it is possible to D somehow set the maximum width of the print string in characters?

I got to do this:

-----
import std.stdio, std.range, std.conv, std.array;

void formatWidthIotaToStr(ref string formatStr, int[] inputRange) {
	
	formatStr ~= ";;";
	int formatWidth = 30, lenStr = formatStr.length;
	
	foreach (e; inputRange) {
		lenStr += e.text.length;
		if (lenStr < formatWidth) {
			lenStr += 2;
			formatStr ~= ' ', formatStr ~= e.text, formatStr ~= ',';
		}
		else {
			formatStr ~= "\n;; ", formatStr ~= e.text, formatStr ~= ',';
			lenStr = e.text.length + 5;
		}
	}
	
	formatStr.length -= 1;
	formatStr ~= '.';
}

void main() {
	
	auto a = iota(10, 1101).array;
	
	string s;
	
	formatWidthIotaToStr(s, a);
	
	writeln(s);
}
-----
http://ideone.com/Yoohbk
April 17, 2015
On Saturday, 11 April 2015 at 22:45:39 UTC, Dennis Ritchie wrote:
> I also want to know whether it is possible to D somehow set the maximum width of the print string in characters?
>
> -----
> void main() {
> 	import std.stdio, std.range;
> 	writefln(";; %(%s, %)).", iota(10, 1101));
> }
> -----
>
> For example, here's the code to Common Lisp which is given by the width of the line is 30 characters:
> -----
> (let ((a (loop :for i :from 10 :to 1100 :collect i)))
> 	(format t "~%;;~{ ~<~%;; ~1,30:;~S~>~^,~}.~%" a))
> -----
> http://ideone.com/hGguge

Looks like there's std.string.wrap to do that:
http://forum.dlang.org/thread/mgqiji$727$1@digitalmars.com
April 17, 2015
On Friday, 17 April 2015 at 09:25:43 UTC, Ivan Kazmenko wrote:
> On Saturday, 11 April 2015 at 22:45:39 UTC, Dennis Ritchie wrote:
>> I also want to know whether it is possible to D somehow set the maximum width of the print string in characters?
>>
>> -----
>> void main() {
>> 	import std.stdio, std.range;
>> 	writefln(";; %(%s, %)).", iota(10, 1101));
>> }
>> -----
>>
>> For example, here's the code to Common Lisp which is given by the width of the line is 30 characters:
>> -----
>> (let ((a (loop :for i :from 10 :to 1100 :collect i)))
>> 	(format t "~%;;~{ ~<~%;; ~1,30:;~S~>~^,~}.~%" a))
>> -----
>> http://ideone.com/hGguge
>
> Looks like there's std.string.wrap to do that:
> http://forum.dlang.org/thread/mgqiji$727$1@digitalmars.com

Yes, it's a lot better but I did not get to concatenate the string ";;" in each paragraph:

-----
import std.conv, std.stdio, std.range, std.string;

void main() {

	auto a = iota(10, 1101).text;

	a = a[1 .. $ - 1], a ~= '.';

	writeln(wrap(a, 30));
}
-----
http://ideone.com/jsSbKj
April 20, 2015
> Yes, it's a lot better but I did not get to concatenate the string ";;" in each paragraph:
>
> -----
> import std.conv, std.stdio, std.range, std.string;
>
> void main() {
>
> 	auto a = iota(10, 1101).text;
>
> 	a = a[1 .. $ - 1], a ~= '.';
>
> 	writeln(wrap(a, 30));
> }
> -----
> http://ideone.com/jsSbKj

	writeln(wrap(a, 30, ";; ", ";; "));

Works with dmd 2.066.1 and 2.067.0.
April 20, 2015
On Monday, 20 April 2015 at 17:16:21 UTC, Ivan Kazmenko wrote:
> 	writeln(wrap(a, 30, ";; ", ";; "));
>
> Works with dmd 2.066.1 and 2.067.0.

Thanks.