ludic/docs/language/structure/kw-extern.md
Orkuncakilkaya effb3f637f refactor(lang): rename the ptr/ptrs types to pointer/pointers
Expand the abbreviated pointer types to full words on the language surface:
  ptr   ->  pointer     (a raw address / FFI handle)
  ptrs  ->  pointers    (a buffer of pointers)

The Ludic type name is distinct from LLVM's own `ptr` spelling: llty() maps
`pointer`/`pointers` to LLVM `ptr`, and the emitted IR keeps `ptr`, so only
the Ludic-level surface changes. Rewrites type annotations across all
sources, the 8 hardcoded pointer type-tags, the `pointers`-buffer indexing
in emit_addr, the grammars/LSP/JetBrains tokens, and the docs
(type-ptr -> type-pointer, type-ptrs -> type-pointers). int/bool keep their
conventional short spelling (like Math).

Reseeded; C-free fixpoint holds; all suites green (45/24/29); site + check.py OK.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-30 01:58:54 +03:00

1.3 KiB


id: kw-extern name: extern category: structure kind: keyword tokens: extern sig: extern function 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 function 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, pointer, …).

Parameters:

  • a — a typed argument passed straight through to the foreign symbol
program Physics {
  extern function 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(string(flr(speed)))
    }
  }
}