I'm trying to design a theoretical programming language and I'm facing a problem with high order functions. The language is strong-typed, so the way to define a standard function is like so :
function name ( type1 arg1 , type2, arg2, ... ) : return_type
There's also a way to define data structures like classes (that are types) :
class MyClass
{
type1 attribute1;
type2 attribute2;
...
}
Now, I would like to extend the function definition to higher-order so that parameters and return values can be classes (types), attributes or functions. For instance having the capability of defining a function that takes as parameter a class or a class member. Let's take an exemple :
function sort ( List<something> data, ??? attribute_name , ??? sorting_function ) : List
This function is supposed to take as first parameter as List
of something
-typed instances, as second parameter an attribute of the something
class, and as third parameter a comparison function.
And attribute_name and sorting_function have to be typed. But how ? What should be instead of the ???
?
I consider an heresy to create a function
, class
, or attribute
type, since they wouldn't be at the same logic-level than data types.
This would also imply to have type
type, which is even more confusing.
I'm probably missing something in my language-design logic because I'm somehow trying to mix at the same logic-level data and language structure but I totally don't know how to achieve what I want otherwise.
Edit :
To give more details, what matters to me is to have a true seperation between data and models. For instance what we can do in languages such as python or php like :
getattr(obj, attr_name)
or
$obj->$attr_name
doesn't suit my logic since we use data-level (strings) to access attributes, which are structure-level.
In my sort
function I gave as example (let's forget the last parameter) we have :
function sort ( List<something> data, ??? attribute_name )
The type of attribute_name
cannot be a string, since attributes are not data-level. There should be proper type that designate attributes (class members).
But such a type is not a data-type. The real problematic is finding a way to distinguish data-types from strucutre/meta-types that correspond to the different langauge structures.
Class<?>
in Java. C++ is one of the few languages that reifies attribute accesses: you can pass around so-called pointer-to-member. This is similar to using a string in PHP or Python, but a pointer-to-member can be type-checked. Sometimes reified concepts get special syntax, sometimes ordinary type syntax is used (e.g.A (*)(B)
vsFunction<A, B>
)