ceylon / ceylon-spec

DEPRECATED
Apache License 2.0
108 stars 34 forks source link

refine `Callable` attributes as if they were functions and vice versa #1472

Open zamfofex opened 7 years ago

zamfofex commented 7 years ago

It’d be nice to be able to refine Callable attributes as if they were functions and vice versa. Things that I’d like to see working:

abstract class Foo()
{
    shared formal String(String) surround;
}

class Bar()
extends Foo()
{
    shared actual String surround(String str) => "\{RIGHT DOUBLE QUOTATION MARK}``str``\{LEFT DOUBLE QUOTATION MARK}";
}
abstract class Foo()
{
    shared formal String id(String str);
}

class Bar()
extends Foo()
{
    id = identity<String>;
    // or
    // shared formal String id = identity<String>;
}
abstract class Foo<T>()
{
    shared formal T member;
}

class Bar()
extends Foo<String(String)>()
{
    shared formal String member(String str) => "\"``string``\"";
}

A little harder to support:

abstract class Foo()
{
    shared formal String member(String str);
}

class Bar()
{
    shared formal String(String) member
    {
        if(random())
        {
            retrun(identity<String>);
        }
        else
        {
            return(function(String str) => str + "!!!");
        }
    }
}
zamfofex commented 7 years ago

Oops, wrong repo, I’ll migrate this issue to the new repo. Derp.

lucaswerkmeister commented 7 years ago

Shortcut refinement supports both directions already:

abstract class Foo()
{
    shared formal String(String) surround;
}

class Bar()
extends Foo()
{
    surround(String str) => "\{RIGHT DOUBLE QUOTATION MARK}``str``\{LEFT DOUBLE QUOTATION MARK}";
}

try online

abstract class Foo()
{
    shared formal String id(String str);
}

class Bar()
extends Foo()
{
    id = identity<String>;
}

try online

abstract class Foo<out T>()
{
    shared formal T member;
}

class Bar()
extends Foo<String(String)>()
{
    member(String str) => "\"``string``\"";
}

try online