dython ~master
D code preprocessor that adds significant whitespace support.
To use this package, run the following command in your project's root directory:
						Manual usage
						
						Put the following dependency into your project's dependences section:
					
Dython
import dython;
mixin(dythonizeFile!"main.dy");
//Or:
mixin(dythonize(q{
import std.stdio
int main()
    int a, b
    readf(" %s %s", &a, &b)
    if (a + b != 0)
        writeln(a + b)
        return 0
    else
        writeln("Isn't it awesome?")
        return 1
}));
What it is
Dython is a D source preprocessor that makes your code look like Python. Actually, all that it does is inserting semicolons and braces where DMD wants to see them.
Advantages
- Much cleaner syntax.
 - More code fits on the screen.
 - The compiler will blame you on sloppy indentation.
 - Compilation errors are addressed to the correct source location.
 - Either tabs or spaces can be used, but mixing them is prohibited.
 - Zero run-time cost.
 - Compatible with DMD and LDC (and maybe also GDC — was not tested).
 
Drawbacks
- Compilation is slower. Not terribly slow, but the difference is clearly visible. Things should go better when a compile-time bytecode interpreter is merged into DMD.
 - DCD just gets stuck.
 caseandgotolabels (and attribute likeprivate:) must be indented:
final switch (x)
    case 0:
    doSomething()
    break
    case 1:
        //You can indent the block even more if you'd like.
        doSomethingElse()
        break
This issue can be overcome (at some extent) by placing extra braces:
struct Thing {
nothrow pure @safe @nogc
    //...
}
- Sometimes you still have to put braces and even semicolons (most notably, with delegates and
  struct initializers). Also, a trailing comma in a struct initializer is required
  (
Thing th = { x, y, };). - And sometimes backslash line splicing has to be done (usually, in long function definitions):
 
auto joiner(RoR, Separator)(RoR r, Separator sep) \
if (isInputRange!RoR && isInputRange!(ElementType!RoR) &&
    isForwardRange!Separator &&
    is(ElementType!Separator: ElementType!(ElementType!RoR)))
    //body
  Unfortunately, \ isn't a valid D token and thus is unavailable in q{}-strings. I'm looking for
  a replacement (maybe //\ or @? Submit an issue if you have an idea on that question).
How to use it
module dython
pure @safe
    S dythonize(S: const(char)[ ] = string)(const(char)[ ] source)
    S dythonizeFile(S: const(char)[ ], string fileName)()
    string dythonizeFile(string fileName)()
dythonize processes source code passed as an argument and dythonizeFile string-imports a file
with a given name. Both may be asked to return a char[ ] instead of string:
//`enum` to force compile-time evaluation.
enum header      = dythonize!(char[ ])(q{import std.algorithm, std.range});
char[ ] contents = dythonizeFile!(char[ ], "contents.dy");
How it works
The parser is intentionally kept quite simple to make it faster. It follows few rules:
- If the indentation increases, a brace is opened on the previous line, unless it ends with one of
   
=>,\{. - If the indentation decreases or stays consistent, a semicolon is appended to the previous line,
   unless it ends with one of 
=>,:;\{}, and then needed amount of braces are closed. \is erased from the resulting code.- Code rewriting is disabled inside parentheses and brackets and re-enabled inside user-placed braces.
 
Of course, comments and strings are properly skipped.
Dython passes three-stage bootstrapping (a standard self-hosting compiler stress test), so the possibility of a nasty bug in it is rather small. Some Sed scripting is required to turn it into a self-hosting one, though.
Conclusion
Even if you won't use it at all, I hope you've got as much fun reading this as much I've got implementing this.
- ~master released 5 years ago
 - SirNickolas/Dython
 - MIT
 - Copyright © 2017, Nickolay Bukreyev
 
- Authors:
 - Dependencies:
 - none
 - Versions:
 - 
						
Show all 2 versions0.1.0 2017-Aug-11 ~master 2020-Mar-08  - Download Stats:
 - 
						
- 
								
0 downloads today
 - 
								
0 downloads this week
 - 
								
3 downloads this month
 - 
								
56 downloads total
 
 - 
								
 - Score:
 - 0.4
 - Short URL:
 - dython.dub.pm