[OT] Language design question

Ary Borenszweig ary at esperanto.org.ar
Thu May 28 07:10:57 PDT 2009


Robert Fraser wrote:
> Hey all,
> 
> Without revealing too much I'm currently working on a programming 
> language for a research project (it's implemented in D, of course!). I'm 
> trying to figure out a good syntax for type annotations. I realized that 
> under my current scheme the "fun" keyword in my language now serves 
> three purposes:
> - syntax sugar for declaring a function
> - a type annotation for a function
> - introducing a literal function/lambda
> 
> So a lazy evaluation/application could be written something like:
> 
> fun fun $a() lazyApply(fun $a($b) f, $b x) => fun $a() => f(x);
> 
> Where the first "fun" starts a function declaration, the next two 
> indicate function types, and the last one indicates a lambda expression. 
> This, if you'll forgive the pun, might not be so fun. Of course, since 
> the language supports type inference, it could be written more simply as 
> one of:
> 
> fun lazyApply(f, x) => fun() => f(x);
> fun lazyApply(f, x) => f@(x);
> 
> (All are equavalent to the D2 closure function:
> 
> T delegate() lazyApply(t, U)(T delegate(U) f, U x)
>     { return T() { return f(x); } }
> 
> )
> 
> What do you think of this? Do I need to find a different syntax? Some 
> other possible syntaxes I thought of (where x, y, and z are types)
> 
> {y, z -> x}
> {(y, z) -> x}
> 'x(y, z)
> \x(y, z) (Might be confusing since \ introduces lambda expressions in 
> other languages)
> 
> Which would make the above monstrosity look like:
> 
> fun {-> $a} lazyApply({$b -> $a} f, $b x) => fun {-> $a} => f(x);
> fun {() -> $a} lazyApply({($b) -> $a} f, $b x) => fun {() -> $a} => f(x);
> fun '$a() lazyApply('$a($b) f, $b x) => fun '$a() => f(x);
> fun \$a() lazyApply(\$a($b) f, $b x) => fun \$a() => f(x);
> 
> The short versions would remain the same in all cases:
> 
> fun lazyApply(f, x) => fun() => f(x);
> fun lazyApply(f, x) => f@(x);
> 
> Any thoughts/suggestions?

I like the 'x(y, z) syntax because its short. Too much fun is not fun. :-P

Do you need an extra symbol to denote a function type? Can't you just write:

fun $a() lazyApply($a($b) f, $b x) => fun $a() => f(x);

Do you have ambiguities with that? I don't know your language, but if 
you only use function types when declaring a type, then I think there's 
no problem.



More information about the Digitalmars-d mailing list