My experimental programming languages

These are programming languages I made to try certain ideas about language design. Unlike my esoteric languages, these are based on features which I think (or thought) could potentially be useful in languages designed for actual use, although the languages here are missing some features that languages designed for actual use would need.

Some knowledge of programming is assumed by these pages.

Brackets after each language indicate the language the interpreter or compiler is written in (multiple pairs of brackets = multiple interpreters; crossed out = probably not compatible with your browser/computer). Everything here so far you'll have to download.

Full list

Actions

A programming language that combines features from functional and imperative languages. The main interesting feature is actions, which are intended as an alternative to Haskell's monads.

While many of my other esolangs are based on ideas that would clearly not be good in a non-esoteric language, this one I intended more as a proof-of-concept of something I thought might be able to be developed into a good idea, though in its current form many desirable language features are missing (like integer, string, and list literals).

Example (Fibonacci as asterisks):

+stdlib
{
+Nat Char List var while = stdlib;

less x y = (x.sub y).zero;

\io {
	var \a {var \b{
		a.set Nat.0!;
		b.set Nat.1!;
		while { less (a.get!) Nat.8.0 } {
			a.get!.dotimes \n { io.print (List.just Char.star)! }!;
			io.print (List.just Char.nl)!;
			c = b.get!.add (a.get!);
			a.set (b.get!)!;
			b.set c!
		}!;
	}!}!
}
}

C//

C// (pronounced "C divided-by divided-by") is a simplified version of C that I made for a class project in university in 2014. The class was about programming language implementation, and the project was an open-ended "do something related to the topic of the class"-type project. The topic I chose was:

Is having pass-by-reference semantics (or Java's pass-a-reference-by-value semantics) for non-primitive data types necessary for performance?

I've also posted a paper that I wrote for the class about my implementation of the language.

Example:


struct s {int x;};
void do_something(struct s var) {
	var.x = 2; // does not modify var1
}
int main() {
	struct s var1;
	struct s var2;
	var1.x = 1;
	do_something(var1);
	var2 = var1;
	var2.x = 3; // does not modify var1
	print(var1.x);
	return 0;
}