Moving from Python to D

Nick Sabalausky via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu May 7 21:06:13 PDT 2015


I'm not really sure exactly what parts are the issue, but I'll point out 
what I can:

On 05/07/2015 11:24 PM, avarisclari wrote:
> Hello,
>
> Sorry to bother you with something trivial, but I am having trouble
> translating a block of code I wrote in Python over to D. Everything else
> I've figured out so far. Could someone help me understand how to get
> this right?
>
> Here's the python:
>
> scene = scenes["title"]

It looks like scenes is a dictionary that stores dictionaries of 
strings? If so, then in D, scenes would be declared like this:

string[string][string] scenes;

Then the above line would be:

auto scene = scenes["title"]

>
> while 1 == 1:

In D, while(true) is probably prefered, but that's just a matter of 
style. 1==1 will work too.

>      next_choice = None
>      paths = scene["paths"]
>      description = scene["description"]
>      lines = string.split("\n")
>

Phobos (D's standard library) has a split:
http://dlang.org/phobos/std_array.html#split

Also one specifically for splitting lines:
http://dlang.org/phobos/std_string.html#splitLines

They're easier to use than it looks:
auto lines = description.split("\n");

or better yet (also handles mac and win-style properly):
auto lines = description.splitLines();


>      for line in lines:

Standard foreach:

for(ref line; lines) {

>          if len(line > 55):
>              w = textwrap.TextWrapper(width=45, break_long_words=False)

Exists in Phobos:
http://dlang.org/phobos/std_string.html#wrap

I've never actually used it myself though.

>              line = '\n'.join(w.wrap(line))

Join is easy:
http://dlang.org/phobos/std_array.html#join

result = (whatever array or range you want to join).join("\n")

But really, I don't think you'll need this entire loop at all, though. I 
would just strip all the newlines and feed the result to Phobos's 
wrap(). Probably something like:

auto description =
	scene["description"].replace("\n", " ").wrap(45);

That should be all you need for the word wrapping.

>          decription += line +"\n"

D uses ~ to concatenate strings instead of +. In D, + is just for 
mathematical addition.

>      print description
>

writeln(description);

>
>
>      #Shows the choices
>      for i in range(0, len(paths)):

foreach(i; 0..paths.length) {

>          path = paths[i]
>          menu_item = i + 1
>          print "\t", menu_item, path["phrase"]

writeln("\t", menu_item, path["phrase"]);
>
>      print "\t(0 Quit)"
>
>      #Get user selection

// Get user selection

>
>      prompt = "Make a selection ( 0 - %i): \n" % len(paths)

This is in phobos's std.conv: http://dlang.org/phobos/std_conv.html

So, either:

auto prompt = "Make a selection ( 0 - " ~
	paths.length.to!string() ~ "): \n";

or:

auto prompt = text("Make a selection ( 0 - ",
	paths.length, ~ "): \n")

>
>      while next_choice == None:
>          try:
>              choice = raw_input(prompt)

The basic equivalent to raw_input would be readln():
http://dlang.org/phobos/std_stdio.html#readln

But, the library Scriptlike would make this super easy, thanks to a 
contributer:
https://github.com/Abscissa/scriptlike

Pardon the complete lack of styling in the docs (my fault):
http://semitwist.com/scriptlike/interact.html

So, it'd be:

import scriptlike.interact;
auto choice = userInput!int(prompt);

>              menu_selection = int(choice)
>
>              if menu_selection == 0:
>                  next_choice = "quit"
>              else:
>                  index = menu_selection - 1
>                  next_choice = paths[ index ]
>
>          except(IndexError, ValueError):
>                  print choice, "is not a valid selection"
>
>      if next_choice == "quit":
>          print "Thanks for playing."
>          sys.exit()

I forget the function to exist a program, but if this is in your main() 
function, then you can just:

return;

>      else:
>          scene = scenes[ next_choice["go_to"] ]
>          print "You decided to:", next_choice["phrase"], "\n"
>          if sys.platform == 'win32':
>              os.system("cls")
>          else:
>              os.system("clear")
>
> I've got the very last piece set up, using consoleD to use
> clearScreen(), but The rest I'm not sure how to translate. Sorry for my
> incompetence in advance.



More information about the Digitalmars-d-learn mailing list