VOOZH about

URL: https://dev.to/0012303/roc-has-a-free-api-the-fast-functional-language-designed-for-app-developers-m83

⇱ Roc Has a Free API: The Fast Functional Language Designed for App Developers - DEV Community


Roc is a functional programming language focused on speed, simplicity, and friendliness. It compiles to machine code via LLVM, has no runtime exceptions, and is designed to be the 'fast functional language for app developers' — not academics.

Why Roc?

  • Fast — compiles to native code via LLVM
  • No runtime exceptions — everything handled via Result/Tag unions
  • Platform system — separate pure logic from I/O effects
  • Great errors — compiler messages are paragraphs, not cryptic codes
  • Simple — no type classes, no monads, no macros

Install

# Download (nightly)
curl -sSfL https://github.com/roc-lang/roc/releases/latest/download/roc_nightly-linux_x86_64-latest.tar.gz | tar xz

# Or build from source
git clone https://github.com/roc-lang/roc.git
cd roc && cargo build --release

Hello World

app [main] { pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.10.0/vNe6s9hWzoTZtFmNkvEICPErI9ptji_ySjicO6CkucY.tar.br" }

import pf.Stdout

main =
 Stdout.line! \"Hello from Roc!\"
roc run hello.roc

Core Language

# Records
user = { name: \"Alice\", age: 30, email: \"alice@example.com\" }

# Tag unions (like Rust enums)
Color : [Red, Green, Blue, Custom Str]

describe : Color -> Str
describe = \\color ->
 when color is
 Red -> \"The color red\"
 Green -> \"The color green\"
 Blue -> \"The color blue\"
 Custom name -> \"Custom: $(name)\"

# Pattern matching
result : Result I64 [DivByZero]
result =
 when divisor is
 0 -> Err DivByZero
 n -> Ok (dividend // n)

# Pipelines
numbers =
 [1, 2, 3, 4, 5]
 |> List.map (\\x -> x * 2)
 |> List.keepIf (\\x -> x > 4)
 |> List.sum

Web Server (basic-webserver platform)

app [main] { pf: platform "https://github.com/roc-lang/basic-webserver/..." }

import pf.Http exposing [Request, Response]
import pf.Task exposing [Task]

main : Request -> Task Response []
main = \\req ->
 when req.url is
 "/" -> Task.ok { status: 200, headers: [], body: Str.toUtf8 \"Welcome to Roc!\" }
 "/api/users\" -> Task.ok {
 status: 200,
 headers: [(\"Content-Type\", \"application/json\")],
 body: Str.toUtf8 \"[{\\\"name\\\": \\\"Alice\\\"}]\"
 }
 _ -> Task.ok { status: 404, headers: [], body: Str.toUtf8 \"Not found\" }

Platform System

+-------------------+ +--------------------+
| Your App | | Platform |
| (Pure Logic) | <-> | (I/O Effects) |
| No side effects | | File, Network, |
| Testable | | Stdout, HTTP |
+-------------------+ +--------------------+

Platforms provide: CLI, Web Server, WASM, GUI, embedded — your app logic stays pure.

Key Features

Feature Details
Typing Static, inferred, no annotations needed
Compilation LLVM → native machine code
Error handling Result types, tag unions
Immutability Everything immutable by default
Platforms CLI, Web, WASM, custom
Package manager Built-in

Resources


Exploring modern languages? I build custom tools and data pipelines. Check my Apify actors or email spinov001@gmail.com.