Today the Hobbyist, Tommorow, The World!

Dave Dave_member at pathlink.com
Thu May 4 13:09:20 PDT 2006


Derek Parnell wrote:
> On Fri, 05 May 2006 04:36:30 +1000, Dave <Dave_member at pathlink.com> wrote:
> 
> 
>> Sure! I'll put it on Wikipedia too.
> 

No prob. - Want to 'wikify' that instead?

> Hope you don't mind but here is a more annotated version that shows off 
> a couple of other goodies.
> 
> #!/usr/bin/dmd -run
> /* sh style script syntax is supported! */
>  /* Hello World in D
>    To compile:
>    dmd hello.d
>     or to optimize:
>    dmd -O -inline -release hello.d
> 
>    To get generated documentation:
>     dmd hello.d -D
> */
>  import std.stdio;  // References to commonly used I/O routines.
>  void main(char[][] args)   // 'void' here means return 0 by default.
> {
>     // Write-Formatted-Line
>     writefln("Hello World, "   // automatic concatenation of string 
> literals
>              "Reloaded");
>      // auto type inference and built-in foreach
>     foreach(argc, argv; args)
>     {
>         // OOP!
>         CmdLin cl = new CmdLin(argc, argv);
> 
>         // improved 'printf' !!
>         // user-defined class properties.
>         writefln(cl.argnum, cl.suffix, " arg: %s", cl.argv);
>         // Garbage Collection or explicit memory management!!!
>         delete cl;
>     }
>      // Nested structs, classes and functions!
>     struct specs
>     {
>         // all vars. automatically initialized
>         int count, allocated;
>     }
> 
>     // 'char[][]' reads right to left - an array of an array of chars.
> 
>     specs argspecs(char[][] args)
>     // Optional (built-in) function contracts.
>     in{
>         assert (args.length > 0); // assert built in
>     }
>     out(result){
>         assert(result.count == CmdLin.total);
>         assert(result.allocated > 0);
>     }
>     body{
>         specs* s = new specs;
>         // no need for '->'
>         s.count = args.length;  // The 'length' property is number of 
> elements.
>         s.allocated = typeof(args).sizeof; // built-in properties for 
> native types
>         foreach(argv; args)
>             s.allocated += argv.length * typeof(argv[0]).sizeof;
>         return *s;
>     }
> 
>     // built-in string and common string operations, eg. '~' is 
> concatenate.
>     char[] argcmsg  = "argc = %d";
>     char[] allocmsg = "allocated = %d";
>     writefln(argcmsg ~ ", " ~ allocmsg,
>          argspecs(args).count,argspecs(args).allocated);
> }
> /**
>    Stores a single command line argument.
> */
>  class CmdLin
> {
>     private {
>      int _argc;
>      char[] _argv;
>      static uint _totalc;
>     }
> 
>  public:
>     /************
>       Object constructor.
>       params:
>         argc = ordinal count of this argument.
>         argv = text of the parameter
>      */
>     this(int argc, char[] argv)
>     {
>         _argc = argc;
>         _argv = argv;
>         _totalc++;
>     }
> 
>     ~this() // Object destructor
>     {
>         // Doesn't actually do anything for this example.
>     }
> 
>      int argnum() /// A property that returns arg number
>     {
>         return _argc + 1;
>     }
>      char[] argv() /// A property that returns arg text
>     {
>         return _argv;
>     }
>      wchar[] suffix() /// A property that returns ordinal suffix
>     {
>         wchar[] suffix;  // Built in Unicode strings (utf8,utf16, utf32)
>         switch(_argc)
>         {
>         case 0:
>             suffix = "st";
>             break;
>         case 1:
>             suffix = "nd";
>             break;
>         case 2:
>             suffix = "rd";
>             break;
>         default:  // 'default' is mandatory with "-w" compile switch.
>             suffix = "th";
>         }
>         return suffix;
>     }
> 
>     /***************
>       * A property of the whole class, not just an instance.
>       * returns: The total number of commandline args added.
>       *************/
>      static typeof(_totalc) total()
>     {
>         return _totalc;
>     }
> }
> 
> --Derek Parnell
> Melbourne, Australia



More information about the Digitalmars-d mailing list