Thread overview
How to add a character literal to a string without ~ operator?
Apr 04
BoQsc
Apr 04
user1234
Apr 08
IchorDev
April 04

I'm looking for more readable standard function to add a character literal to a string.

The ~ operator is clearly not great while reading a source code.
I'm not here to discuss that. I'm looking for a function inside standard library.

The function should be straightforward, up to two words.

Here is what I expect from a programming language:

Pseudo example:

import std;
void main(){
	string word = hello;
	join(word, 'f', " ", "World");
	writeln(word);   	// output: hellof World
	
}
	
April 04

On Thursday, 4 April 2024 at 18:14:54 UTC, BoQsc wrote:

>

I'm looking for more readable standard function to add a character literal to a string.

The ~ operator is clearly not great while reading a source code.
I'm not here to discuss that. I'm looking for a function inside standard library.

The function should be straightforward, up to two words.

Here is what I expect from a programming language:

Pseudo example:

import std.array, std.stdio;
void main()
{
  auto word = appender("hello");
  word.put('f');
  word.put(" ");
  word.put("World");
  word.writeln;
}	

SDB@79

April 04

On Thursday, 4 April 2024 at 18:14:54 UTC, BoQsc wrote:

>

I'm looking for more readable standard function to add a character literal to a string.

The ~ operator is clearly not great while reading a source code.
I'm not here to discuss that. I'm looking for a function inside standard library.

The function should be straightforward, up to two words.

Here is what I expect from a programming language:

Pseudo example:

import std;
void main(){
	string word = hello;
	join(word, 'f', " ", "World");
	writeln(word);   	// output: hellof World
	
}
	

My favorite d feature is lazy ranges. No allocation here.

auto s = chain("as ", "df ", "j"); // s is lazy
writeln(s);

Of course you can allocate a new string from the chained range:

string str = cast(string)s.array.assumeUnique; // without a cast it is a dstring (why though?)
April 04

On Thursday, 4 April 2024 at 19:56:50 UTC, Ferhat Kurtulmuş wrote:

>

On Thursday, 4 April 2024 at 18:14:54 UTC, BoQsc wrote:

>

I'm looking for more readable standard function to add a character literal to a string.

The ~ operator is clearly not great while reading a source code.
I'm not here to discuss that. I'm looking for a function inside standard library.

The function should be straightforward, up to two words.

Here is what I expect from a programming language:

Pseudo example:

import std;
void main(){
	string word = hello;
	join(word, 'f', " ", "World");
	writeln(word);   	// output: hellof World
	
}
	

My favorite d feature is lazy ranges. No allocation here.

auto s = chain("as ", "df ", "j"); // s is lazy
writeln(s);

Of course you can allocate a new string from the chained range:

string str = cast(string)s.array.assumeUnique; // without a cast it is a dstring (why though?)
module runnable;

import std.stdio : writeln;
import std.range : chain;

void main() @nogc
{
    auto s = chain("as ", "df ", "j"); // s is lazy
    writeln(s);
}

Bad example. The range is indeed a @nogc lazy input range but writeln is not a @nogc consumer.

>

/tmp/temp_7F91F8531AB0.d(9,12): Error: @nogc function D main cannot call non-@nogc function std.stdio.writeln!(Result).writeln
/bin/ldc2-/bin/../import/std/stdio.d(4292,6): which calls std.stdio.trustedStdout

The input range consumer has to be @nogc as well.

April 05

On Thursday, 4 April 2024 at 19:56:50 UTC, Ferhat Kurtulmuş wrote:

>

My favorite d feature is lazy ranges. No allocation here.

auto s = chain("as ", "df ", "j"); // s is lazy
writeln(s);
import std.range : chain;
void main()
{
  string word = "hello";
  auto noError = chain(word, "f", " ", "World");
  /** auto noCompile = chain('f', " ", "World");
    *                         ^
     *************************|****************/
}

SDB@79

April 05

On Thursday, 4 April 2024 at 21:23:00 UTC, user1234 wrote:

>

On Thursday, 4 April 2024 at 19:56:50 UTC, Ferhat Kurtulmuş wrote:

>

[...]

module runnable;

import std.stdio : writeln;
import std.range : chain;

void main() @nogc
{
    auto s = chain("as ", "df ", "j"); // s is lazy
    writeln(s);
}

Bad example. The range is indeed a @nogc lazy input range but writeln is not a @nogc consumer.

>

[...]

The input range consumer has to be @nogc as well.

I don't understand your point sorry. I didn't imply anything about @nogc. I of course know writeln is not nogc. I just kept the example simple.

April 08

On Thursday, 4 April 2024 at 18:14:54 UTC, BoQsc wrote:

>

I'm looking for more readable standard function to add a character literal to a string.

Concatenate is the verb you're looking for, not add. 'Adding' a char to a string sounds like you want myString[] += myChar;, which wouldn't compile because strings are aliases of immutable(char)[].

>

Pseudo example:

import std;
void main(){
	string word = hello;
	join(word, 'f', " ", "World");
	writeln(word);   	// output: hellof World
	
}
	

I'd usually use text. It automatically converts each parameter to a string and concatenates all of them. If you prefer format strings, there's format.