ludic/docs/language/structure/kw-extern.md
Orkuncakilkaya 31f1019a69
All checks were successful
docs / build-and-deploy (push) Successful in 2s
docs(site): vertical pipeline on mobile, click tooltips, consistent chrome
- Pipeline diagram stacks vertically with downward arrows on mobile (row on
  >=720px) instead of the awkward wrap.
- Tooltip cards now open on CLICK (works on touch too), the card itself is
  clickable and opens the symbol's page in a NEW TAB, and an outside click or
  Escape closes it. Replaces the hover-only behavior.
- Reference pages get their own nav — Home / API Reference / Source ↗ — instead
  of the landing-only Features/Examples/Get started anchors, and now include the
  Source link.
- Unify the container width (1120px) across the landing and all reference pages
  so the header and content align between them.
- Reword extern/@export FFI docs from "C-ABI" to "native" for consistency with
  the site's no-C wording.

Verified in-browser at 375px and 1280px: vertical pipeline, click→card→new-tab,
outside-click close, correct reference nav, aligned container; 158 examples still
compile.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-29 18:42:40 +03:00

1.3 KiB


id: kw-extern name: extern category: structure kind: keyword tokens: extern sig: extern fn name(a: T) -> R = "symbol" tip: Bind a name to an external native symbol — the seam for platform and library calls. order: 12

An extern fn declares a function whose body lives outside Ludic and binds it to a native symbol resolved at link time. It is the seam through which Ludic reaches anything with a native interface — a system library, a math routine, or even another .ludic file compiled as a module. You write the Ludic signature you want to call and give the real symbol name after =; the linker connects them (pass -L/-l to ludicc to point at the library). Types must match the foreign ABI, so map each parameter and the return to the right Ludic type (int, fixed, ptr, …).

Parameters:

  • a — a typed argument passed straight through to the foreign symbol
program Physics {
  extern fn c_hypot(a: fixed, b: fixed) -> fixed = "hypot_fx"

  property Velocity { delta_x: int = 0, delta_y: int = 0 }
  model Projectile { Velocity }

  handler MeasureSpeed phase Update {
    for (velocity) in query [Velocity, {Projectile}] {
      let speed = c_hypot(a: fx(velocity.delta_x), b: fx(velocity.delta_y))
      Screen.status(str(flr(speed)))
    }
  }
}