In a nutshell, Ultraforge is a programming language where programs are laid out visually, as interconnected nodes instead of written text. Ultraforge is Turing-complete. In plain language, this means you can implement any computation within it, making it more similar to traditional programming languages.
Ultraforge lets you create your own nodes. This is done via defining custom functions, just like in programming languages. You put nodes in a Function box, wire them together, define the inputs of the node, and voila — you get your own node where the internal logic is fully defined by you. Nodes created via custom functions are first-class — you can use them in the same manner as you would use a built-in node that came with Ultraforge.
Ultraforge supports recursion, which means that custom functions can call themselves. Recursion serves as a basis for many, many algorithms — and now you can implement these algorithms directly in Ultraforge, in a fully visual way. The picture above shows a recursive Factorial function.
Ultraforge fully supports higher-order functions, that is, functions that take other functions as arguments or return other functions. This allows Ultraforge to have nodes such as Map, Filter, and Fold — the cornerstones of functional programming. A Map node applies a provided function to a list of elements, while a Filter node removes elements from a list that don't satisfy criteria provided by a function. In the example above, a Map node multiplies all elements of a list by 11, then a Filter node removes all non-even numbers from the list.
Unlike Filter Forge that only has three types of nodes (fills, curves, and numeric constants), Ultraforge is based on a full-fledged type system, similar to type systems of programming languages like Haskell.
Having a proper type system allows Ultraforge to have nodes for many, many data types — pixel bitmaps, fills, shapes, strings, floating-point and integer numbers, booleans, chars, or strings. Unlike Filter Forge, the new system can stomach any number of new data types, so it's future-proof in this regard — for example, if we decide to add sound clips as a data type, the type system is already capable of that.
Ultraforge type system supports polymorphism. This means it has nodes supporting multiple data types. For example, a List node can have elements of any type — you can have a list of bitmaps, a list of integers, or even a list of lists of integers. Polymorphic nodes can be restricted to certain type classes — for example, arithmetic nodes will only work with data types that are members of the Num type class, such as Int and Float.
Here's the list of data types planned for version 1:
In the coming months, we'll be launching a closed Ultraforge beta test (Windows only). Your feedback is very important to us. If you're interested in trying out Ultraforge, please join the beta waitlist!