-
Notifications
You must be signed in to change notification settings - Fork 0
Comparing ARO to Other Languages
ARO is a DSL for expressing business features as Action-Result-Object statements. Its syntax reads like a business requirement; its runtime handles routing, errors, and concurrency. This page situates ARO relative to languages you may already know.
Python reads like pseudocode; ARO reads like a business requirement. Both prioritize expressiveness over ceremony, but where Python uses functions and classes, ARO uses business activities and feature sets. Python's error handling is explicit (try/except); ARO's runtime handles errors and produces human-readable messages automatically. Python is a general-purpose tool — ARO is purpose-built for business logic.
Ruby shares ARO's philosophy that code should feel natural to read. Rails pioneered "convention over configuration" for web apps; ARO applies the same idea to business logic with contract-first HTTP and auto-discovered .aro files. Both favor expressiveness, but Ruby metaprogramming can produce cryptic DSLs, while ARO's natural-language syntax stays legible to non-programmers.
Node.js is callback/promise-driven and event-based — so is ARO. But JavaScript carries decades of quirks (coercion, this, async complexity), while ARO's event model is declarative: you name a feature set after an event, and the runtime wires it. JavaScript requires explicit error propagation; ARO's runtime auto-generates error messages from the failed statement itself.
TypeScript adds a type system on top of JavaScript's chaos. ARO's type discipline comes from OpenAPI contracts rather than inline annotations — the schema is defined externally and the runtime enforces it. TypeScript is a general-purpose language with types; ARO is a business DSL where the "type system" is the API contract.
Java made enterprise software verbose and boilerplate-heavy. ARO targets the same enterprise domain with the opposite philosophy — no interfaces, no dependency injection frameworks, no XML config. A Java UserController with annotations, a service layer, and repository interfaces does what a 10-line ARO feature set does. Trade-off: Java has decades of ecosystem; ARO is narrowly focused.
C# with ASP.NET is the closest mainstream equivalent: HTTP APIs, event-driven patterns, contract-first generation via tooling. ARO differs by making the contract (OpenAPI) the source of truth rather than code-gen output. C# is expressive and powerful; ARO trades that power for radical simplicity in the business logic layer.
Go's explicit error handling (if err != nil) is idiomatic but repetitive. ARO takes the opposite stance — the runtime handles errors, and the error message is the failed statement. Go compiles to fast single binaries; ARO does too via aro build. Both value simplicity, but Go's simplicity is at the language level, ARO's is at the business-domain level.
Rust enforces correctness at compile time via ownership and the borrow checker. ARO enforces correctness at the domain level via immutable bindings and the OpenAPI contract. Rust is systems-level with zero-cost abstractions; ARO is business-logic level with zero-boilerplate abstractions. ARO even uses Rust as a plugin language, so they're complementary.
ARO's runtime is written in Swift 6.2 and shares its Sendable/structured concurrency model. Swift enforces safety via the type system and optionals; ARO enforces it via immutable bindings and the event model. Swift is a general-purpose language for Apple platforms and servers; ARO is its domain-specific layer for business rules.
Haskell pursues purity — no side effects except through monads. ARO's action roles (REQUEST, OWN, RESPONSE, EXPORT) encode data-flow direction similarly to how Haskell's type system tracks effects. Both avoid mutable state by default. Haskell requires mastering a steep type-theory learning curve; ARO requires understanding business activities.
Elixir's actor model and the BEAM's fault tolerance are legendary. ARO's EventBus is a simpler message-routing layer — no isolated process per actor, no supervisor trees. Elixir excels at high-concurrency, fault-tolerant distributed systems; ARO targets the business logic layer of smaller, domain-focused services. Elixir's Phoenix is to ARO what a cathedral is to a bungalow.
F# brings functional programming to the .NET ecosystem with discriminated unions and pipelines. ARO's feature-set pipeline (Extract → Compute → Transform → Return) echoes F#'s |> operator. F# is typed and compiled; ARO's types come from OpenAPI schemas at the boundary. Both favor immutability and data transformation over mutation.
Clojure puts data first — maps and sequences over objects. ARO shares this: results are dictionaries, repositories store records, events carry payloads. Clojure's REPL-driven development and Lisp macros enable extreme expressiveness; ARO trades that for readability by non-Lisp speakers. Both treat the happy path as primary.
SQL is the most successful business-domain language ever created. Like ARO, it reads like English: SELECT users FROM orders WHERE status = 'active'. ARO's Retrieve the <users> from the <user-repository> where status = "active" is the application-layer equivalent. SQL operates on relational data; ARO orchestrates business processes. They're natural complements.
COBOL was designed to be readable by business managers. ARO has the same ambition — Extract the <amount> from the <transaction: amount> is closer to COBOL's verbose English than to modern code. COBOL runs payroll systems for half the world's banks; ARO is a modern rethinking of that idea without the 60-year baggage and fixed-width columns.
Gherkin writes business requirements as Given / When / Then scenarios. ARO writes them as executable feature sets. The gap between Gherkin specs and the actual code implementing them is ARO's design target — ARO is the spec and the implementation at once. Gherkin is read by humans but executed via glue code; ARO eliminates the glue.
Kubernetes YAML declares desired state declaratively. ARO is also declarative at the business level — you declare what should happen when an event occurs, not how the runtime should schedule it. Both are human-readable and avoid imperative control flow. YAML configs describe infrastructure; ARO describes business behavior.
AppleScript is the most literal natural-language programming attempt on macOS: tell application "Mail" to send message. ARO applies the same idea to business services: Send the <welcome-email> to the <user: email>. Both prioritize English readability. AppleScript is brittle and narrow; ARO is designed for production business logic.
Smalltalk invented the message-passing model: objects send messages to each other. ARO's event bus is a modern take on this — feature sets respond to events (messages). Smalltalk's image-based environment made everything live and inspectable; ARO's aro run interpreter and aro check linter aim for similar fast feedback. Smalltalk influenced everything; ARO is influenced by that influence.
Kotlin cleaned up Java for Android and server development. Both Kotlin and ARO care about conciseness and correctness. Kotlin's sealed classes and when expressions model business states explicitly; ARO's match and state machine patterns do the same at the language level. Kotlin requires a JVM; ARO compiles to native.
Prolog programs are facts and rules — the engine finds solutions. ARO feature sets are rules triggered by events — the runtime routes execution. Both are declarative and avoid telling the machine how to do things in favor of what should happen. Prolog is for search and constraint satisfaction; ARO is for business process orchestration. Neither has much explicit control flow.
Terraform declares infrastructure as code — what resources should exist, not how to create them. ARO declares business behavior as code — what should happen when events occur, not how the runtime orchestrates it. Both are declarative, both are domain-specific, and both separate the what from the how. Terraform owns infrastructure state; ARO owns business logic state.
| Language | Paradigm | ARO Similarity | Key Difference |
|---|---|---|---|
| Python | Multi-paradigm | Readable, business-friendly | General-purpose; explicit errors |
| Ruby | OOP / DSL | Convention over config | Metaprogramming vs. natural language |
| JavaScript | Event-driven | Event-based runtime | Async complexity; decades of quirks |
| TypeScript | Typed JS | Contract-driven types | Types in code vs. types in OpenAPI |
| Java | OOP | Enterprise domain | Boilerplate-heavy; explicit wiring |
| C# | OOP | ASP.NET HTTP model | Code-gen vs. contract-first |
| Go | Systems | Single-binary compilation | Explicit errors vs. runtime-generated |
| Rust | Systems | Immutability, correctness | Memory safety vs. domain safety |
| Swift | Multi-paradigm | Runtime host language | General-purpose vs. business DSL |
| Haskell | Functional | Immutability, data flow | Type theory vs. business activities |
| Elixir | Actor model | Event-driven concurrency | Fault tolerance vs. simplicity |
| F# | Functional | Pipeline data flow | Typed vs. contract-typed |
| Clojure | Functional | Data-first records | Lisp expressiveness vs. readability |
| SQL | Declarative | English-like business queries | Data layer vs. process layer |
| COBOL | Procedural | Business-readable English | Legacy baggage vs. modern design |
| Gherkin | BDD spec | Business language as code | Spec only vs. spec + implementation |
| YAML / K8s | Declarative | Desired state declaration | Infrastructure vs. business logic |
| AppleScript | Natural language | English-like actions | Brittle automation vs. business APIs |
| Smalltalk | OOP / messaging | Message passing | Image-based vs. file-based |
| Kotlin | OOP | Conciseness, correctness | JVM vs. native; general vs. domain |
| Prolog | Logic | Declarative rules | Constraint solving vs. event routing |
| Terraform | Declarative | What not how | Infrastructure state vs. business state |
Fundamentals
- The Basics
- Feature Sets
- Actions
- Variables
- Type System
- Control Flow
- Error Handling
- Computations
- Dates
- Concurrency
Runtime & Events
I/O & Communication
Advanced