A feture adjustment request and a syntax blasphemy

Chris Nicholson-Sauls ibisbasenji at gmail.com
Fri Oct 27 23:54:41 PDT 2006


BCS wrote:
> This is allowed:
> 
>   void foo(int[] ar){}
>   ...
>   static int[] i = [1,2,3];
>   i.foo();
> 
> And this is allowed:
> 
>   struct I
>   {
>     int[] v;
>     void foo(){}
>   }
>   ...
>   I i;
>   auto dg = &i.foo;
> 
> So why no this?
> 
>   void foo(int[] ar){}
>   ...
>   static int[] i = [1,2,3];
>   auto dg = &i.foo;
> 
> 
> 
> And another one:
> 
> This is allowed:
> 
>   static int[] i = [1,2,3];
>   void function(int[]) fp = function void(int[] j){return;};
>   i.fp();
> 
> So why no this?
> 
>   static int[] i = [1,2,3];
>   i.function void(int[] j){return;}();
> 
> 
> 
> 
> You may be wondering where this is all going (and what that was about a 
> blasphemy). Well her it is:
> 
> <code type="WTF!">
> 
>     // a base type for derivation
> class Type{}
>     // a templated derived type to store things in
> class TypeT(T) : Type
> {
>     public T val;
>     static TypeT!(T) opCall(T v)
>     {
>         auto ret = new TypeT!(T);
>         ret.val = v;
>         return ret;
>     }
> }
> 
> /*
> Doc ::=
>       A:a B:b C:c    = new Fig(a,b,c)
>     | D:d E:e        = new Fig(d,e)
> */
> TypeT!(Fig) delegate() Parse_Doc(inout char[] from)
> {
>     char[] tmp;
> 
>         // copy from
>     tmp = from;
>     if(auto a = Parse_A(tmp)) // try to parse an "a"
>     if(auto b = Parse_B(tmp)) // try to parse an "b"
>     if(auto c = Parse_C(tmp)) // try to parse an "c"
>     {    // if all's good
>             // update what's been parsed
>         from = tmp;
>         return &(
>                 // make an array from the args
>             [cast(Type delegate())a,b,c]
>                 // copy it (force off stack)
>             .dup
>             )
>                 // form delegate from array
>                 // and function literal               
>             .function TypeT!(Fig)(Type delegate()[] args)
>             {
>                     // literal calls given code
>                 auto ret =
>                     new Fig(
>                         // call args for values
>                     cast(a.typeof)args[0]().val,
>                     cast(b.typeof)args[1]().val,
>                     cast(b.typeof)args[2]().val);
> 
>                     // place in object and return
>                 return TypeT!(ret.typeof)(ret);
>             };
>     }
> 
>         // restore tmp
>     tmp = from;
> 
>         // blah, blah, blah
>     if(auto d = Parse_D(tmp))
>     if(auto e = Parse_E(tmp))
>     {
>         from = tmp;
>         return &([cast(Type delegate())d,e].dup)
>             .function TypeT!(Fig)(Type delegate()[] args)
>             {
>                 auto ret =
>                     new Fig(
>                 cast(d.typeof)args[0]().val,
>                 cast(e.typeof)args[1]().val);
>                 return TypeT!(ret.typeof)(ret);
>             };
>     }
> 
>     return null;
> }
> /*
> A ::=
>     "hello":v    = v
> */
> TypeT!(char[]) delegate() Parse_A(inout char[] from)
> {
>     char[] tmp;
> 
>     tmp=from;
>         // check for a "hello"
>     if(from[0.."hello".length] == "hello")
>     {
>             // update from
>         from = from["hello".length..$];
>             // return delegate returning "hello" in obj
>         return &("hello".dup).function TypeT!(char[])()
>             {
>                 auto ret =
>                     from[0.."hello".length];
>                 return TypeT!(ret.typeof)(ret);
>             };
>     }
> 
>     return null;
> }
> /// ........
> 
> </code>
> <script> for(auto i = brain.Remove; true; i.Lather.Rinse){} </script>
> 
> 
> WHAT IN ALL THAT IS HOLY WAS THAT!!!!
> 
> It is a recursive decent parser that avoids executing actions that are 
> never used. This would allow for actions to have side effects that would 
> otherwise have to be undone after it is discovered that the current 
> parse attempt fails.
> 
> Rather than do each action as it is tried, each reduction function 
> returns a delegate that has enough info to do the actions for the 
> components and the code to use the result to execute the action. After 
> calling the topmost Reduction function, the return value then needs to 
> be called.
> 
> auto a = Parse_Doc(SomeString);
> if(a is null) return;
> auto a().val;
> 
> The important things are
> 
> # making delegates from function used as properties of arrays
> # using function literals in the above.
> 
> I would like to see both of these things added.
> 
> Also, this syntax blasphemy shows that there is a use for som of these 
> things  and was to cool to not post about

My brain hurts from reading that.  You are an evil, evil, little man, and I utterly 
despise you for all that dribble!

And yet... despite myself, I do find it strangely compelling.  :)  Perhaps there ought to 
be a way found to at least achieve what you're after.  Pretty ingenious -- but still very, 
very evil.

-- Chris Nicholson-Sauls



More information about the Digitalmars-d-learn mailing list