3 ms·
A relational programming language is an interesting concept and I have been thinking if somebody could come up with something. I'm not sure that it results in
by genman 3y ago
A relational programming language is an interesting concept and I have been thinking if somebody could come up with something.
I'm not sure that it results in a good reusable code though. Any examples?
- kevindamm 3y agoIn a lot of ways the Logic Programming languages are effectively relational (e.g. Prolog, Datalog, KIF) but the search behavior for relations that satisfy a query is a bit different than SQL-like relational languages. On a previous project I embedded a SQL-like sub-language into a model language so that ETL pipelines and OLAP/OLTP processing could be generated to query aggregates and value lookups during inference. It is nontrivial to embed a relational language into another language without making some compromises but there are certainly contexts where it is quite useful. I think C#'s LINQ is a reasonable effort at this but I'm not much a fan of the rest of that language.
- mamcx 3y agoI have nothing super finished, this is for fun (until I get time or funding!). But I bet is far more reusable than normal code in most cases. The reason is that the relational/array model has more values: https://www.infoq.com/presentations/Value-Values/ https://www.infoq.com/presentations/Value-Values/, and combined with structural types and the power of relational operators you can eliminate a lot of cases where macros or generics come. One major feature of a "values" language is that is naturally introspectable. Not just values, but types, and metadata. So this is NOT crazy: mod People: data Person: name: Str age: Int data Customer: Person //not subtyping but `SELECT * Person INTO Customer` active: Bool end mod Auth: data User: People.Person //not subtyping but `SELECT * People.Person INTO Customer` password: Password active: Bool data UserSafe: User ? deselect password // SELECT People.Person.*, active INTO UserSafe end fn print(p: Person ... ) // Accept anything that is `SELECT name, age FROM ?`, but critically, not remove the other fields, are just invisible here. This means you don't make type conversions in unnecessary cases fn print_type_no_person(mod:Mod): String let types = mod ?select as_data(this) != Some(Person...) // Anything is a relation, anything query types ? union | into(String) //SELECT t1 UNION t2... + reduce()