[Mono-dev] misc: C# request info

BGB cr88192 at hotmail.com
Tue Feb 24 17:36:59 EST 2009

----- Original Message ----- 
From: "Jonathan Pryor" <jonpryor at vt.edu>
To: "BGB" <cr88192 at hotmail.com>
Cc: "Marek Safar" <marek.safar at seznam.cz>; 
<mono-devel-list at lists.ximian.com>
Sent: Wednesday, February 25, 2009 3:22 AM
Subject: Re: [Mono-dev] misc: C# request info

> On Tue, 2009-02-24 at 20:46 +1000, BGB wrote:
>> > C# has some tricky syntax too, some tokens change behaviour of 
>> > following
>> > block. Some are just tricky to parse like generics, nullables, lambdas,
>> > etc.
>> >
>> > Here is one example
>> >
>> > Foo (x <y, z> (0));
>> >
>> AFAIK the above can't be a generic since a generic can't appear in this
>> context (I will assume this being an expression...).
> Behold the proof that it works:
> public static bool x<T1, T2>(int n) {return n != 0;}
> If you have types y and z in scope, and a method Foo(bool), then the
> call Foo(x<y,z>(0)) is in fact, valid, calling the method Foo() with the
> result of the generic method call x<y,z>(0).
>> (funcall Foo (< x y) (> z 0))
>> unless generics can appear in a expression context, which AFAIK they 
>> can't.
> In fact, they can, as demonstrated above.  Don't forget about generic
> methods. :-)

hmm... yes...

well, this adds to the complexity a little...

now that I remember, the disambiguation rule given in this case was that the 
'>' '(' sequence was used to detect this case, otherwise it is assumed to be 
an expression.

however, this still follows under the try-and-fail approach, only that in 
this case it first has to try matching a generic, and fail if it doesn't 
meet the criteria...

actually, all of this has led to a special case:
I have a modified token function which fails to parse '>>' or '>>=', or '>=' 
as a single token, but will instead parse the '>' as a brace and leave the 
rest for later.

but, yes, generics pose a difficulty (which continues leaving me wondering 
why the C++ people originally decided on using this syntax to begin 
with...). for example, couldn't they just as easily have use '{' and '}' for 
templates and have avoided this whole mess?...

"Foo{T};" or even custom braces "Foo<{T}>", rather then create the syntactic 
mess that this notation has caused?...

but, then again, this is the C family, historically known for its adherence 
to difficult to parse syntax...
(unlike the LISP family which has very simple syntax which most people would 
not want to use, and where using tricks to extend the number of brace types 
is common-place...).

oh well, at least I have more ideas for exception handling.
I had the idea that I can actually make a generic C-based API (making the 
handling C-usable), and probably internally use a potentially optimized form 
of this interface.

tehState state; //exception handling state
}else if(tehCatchP(state, "Foo"))
    //specific exception class
}else if(tehCatchP(state, NULL))
    //generic unhandled exception
}else if(tehUnwindP(state))
    //unknown state

now, this is not the lowest-possible-overhead route, but it is probably not 
like large amounts of time will be going into tight-loop exception handling 

still unsure how to best represent exception handling in RPNIL (my 
compiler's native IL).

I am currently thinking:
try_p $L0 jmp_true
$Foo catch_p $L1 jmp_true
unwind_p $L2 jmp_true
$RuntimeError throw
L0: <try...> $L3 jmp
L1: <handler...> $L3 jmp
L2: <finally...> rethrow
L3: <finally...>

actually, it may seem odd, but I use a vaguely similar construction to 
represent something analogous to the phi operator (allowing multiple-path 
stack item merging). note that the stack used here is not the machine stack, 
and typically also pushes literals, registers, symbols, blocks, ... onto the 
stack as well (and likewise, code which will conditionally modify the stack 
is not allowed).

"%cond $L0 jmp_true exch L0:" is an error condition...

for the time being I will ignore generics at this level...

> - Jon

More information about the Mono-devel-list mailing list