[OT] What should be in a programming language?
Jason House
jason.james.house at gmail.com
Mon Oct 26 07:22:45 PDT 2009
Yigal Chripun Wrote:
> On 25/10/2009 06:26, Jason House wrote:
>
> > My web search and some PDF's didn't turn up a handy example. You can
> > do things in scala like define your own foreach loop. If foreach had
> > the form form foreach(x){y} then x would be one set of arguments and
> > y would be another set. It makes for pretty use of library functions.
> > They look built in!
> >
>
> isn't that similar in concept to code blocks?
I'm not familiar enough with code blocks to say for sure. From what I saw in blogs, they are not. Either way, D can't make things look built in like scala can. IMHO, it's a great programming language feature.
> > I looked over the links (quickly). I must admit I don't get it yet.
> > It takes me a while to digest lisp fragments... Can you give a D-ish
> > example of what it'd look like?
> >
> >
> here's a Nemerle example:
>
> macro PrintStage() {
> System.Console.WriteLine("This is executed during compilation");
> <[ System.Console.WriteLine("This is executed at run time") ]>
> }
>
> the first WriteLine is executed during compilation, and the macro
> returns the AST for the second WriteLine which will be executed at run
> time when this macro is called.
How is that different from a normal function definition that includes some compile-time calls? I agree that compile-time code should look and feel like normal code. It seems you use macro to switch to compile-time by default and runtime when explcitly marked? Having both defaults (compile time or run time) makes sense.
> one important design goal is to clearly separate the stages, so this
> will go to a separate .d file and will be compiled into a lib.
> to use this macro you simply specify
> compiler --load-macro=myMacro sources.d
>
> in user code you just use "print();"
I disagree with this. The code that uses the macros should declare what it uses.
>
> OK, here's an example:
>
> class Foo {
> int a;
> void bar();
> }
>
> auto obj = new Foo;
> obj.a = 42; // obj contains a
> obj.bar(); // calls 'Foo.vtbl.bar
>
> remember that 'Foo is the classinfo singelton for Foo
>
> class Foo {
> static a;
> static void bar();
> }
>
> Foo.a = 42; // 'Foo contains a
> Foo.bar(); // calls ''Foo.vtbl.bar
>
> ''Foo is the classinfo singelton for 'Foo
>
> we get the following chain ("-->" means instance of)
> obj --> Foo --> MetaFoo --> MetaClass --> Class
>
> compared with C++/D/Java/etc:
> obj --> Foo --> Class
Ok. That makes sense. It can be simplified when statics are removed.
More information about the Digitalmars-d
mailing list