primus_quem
Translation status: Tiếng Việt reader-locale proof. Term names and code fences follow the vi pack; supporting prose may still be English.
Dedicated total first-match expression: first live element of a source satisfying the owned ubi predicate, rỗng_ty for no-match and empty sources.
Aliases: primus quem
Syntax: primus_quem(<source>, ubi <binder> { <predicate> })
Category#
collection
Related#
Examples#
radix/corpus/primus-quem/primus-quem.fab (canonical · concept)#
Dedicated total first-match expression: first live element of a source satisfying the owned ubi predicate, rỗng_ty for no-match and empty sources.
# =============================================================================
# primus_quem — dedicated total first-match selection over a bounded source.
# =============================================================================
#
# What this teaches:
# • dedicated head — `primus_quem(source, ubi x { predicate })` is its own
# expression (not a `dừng`/`nếu` reuse and not a method call); the `ubi`
# tail is owned by this head
# • total evaluation — the predicate is evaluated for EVERY candidate làn
# (post-match lanes included); selection is dataflow first-live, never an
# early exit
# • `T ∪ rỗng_ty` — no-match and empty sources return `rỗng_ty`, never an error;
# a predicate ERROR rides the error channel and is never converted to
# `rỗng_ty`
# • first-live — later live lanes never overwrite the first stored match
# ([1.0, 5.0, 3.0] over `> 2.0` picks 5.0, not 3.0)
# • declines — unbounded sources fail closed (SEM059
# first_match_unbounded_source, causa not_bounded) and multi-axis `tại`
# coordinates stay unsupported in v1 (SEM059
# first_match_expression_unsupported); see primus-quem-decline.fab
#
# Common mistakes:
# • expecting an index/value pair — v1 returns only `T ∪ rỗng_ty`; construct
# the explicit pair yourself if you need the index
# • expecting early exit — the predicate still runs after the first match
#
# See also: ubi, rỗng_ty, filtrata, primus
# =============================================================================
# Route T — array literal source: first live làn over `> 0.0` is 1.0.
hàm elige_litteram() → thập_phân ∪ rỗng_ty {
trả primus_quem([1.0, -2.0, 3.0], ubi x { x > 0.0 })
}
# No-match — no live làn yields rỗng_ty, never an error.
hàm elige_nullum() → thập_phân ∪ rỗng_ty {
trả primus_quem([1.0, 2.0], ubi x { x > 9.0 })
}
# Empty source — a statically zero-length array yields rỗng_ty.
hàm elige_vacuum(danh_sách<f32> xs) → thập_phân ∪ rỗng_ty {
trả primus_quem(xs, ubi x { x > 0.0 })
}
# First-live — with matches at 5.0 and 3.0, the FIRST live làn wins.
hàm elige_primum_viventem(danh_sách<f32> xs) → thập_phân ∪ rỗng_ty {
trả primus_quem(xs, ubi x { x > 2.0 })
}
bắt_đầu {
hằng thập_phân ∪ rỗng_ty litteram ← elige_litteram()
hằng thập_phân ∪ rỗng_ty nullum ← elige_nullum()
hằng danh_sách<f32> vacua_lista ← []
hằng thập_phân ∪ rỗng_ty trống ← elige_vacuum(vacua_lista)
hằng danh_sách<f32> xs ← [1.0, 5.0, 3.0]
hằng thập_phân ∪ rỗng_ty primum ← elige_primum_viventem(xs)
ghi_chú litteram
ghi_chú nullum
ghi_chú trống
ghi_chú primum
}Expected output:
1.0
nihil
nihil
5.0
radix/corpus/primus-quem/primus-quem-decline.fab (supporting · reject)#
primus_quem AIR decline rows: unbounded sources fail closed (not_bounded) and tại coordinates on first-match stay unsupported in v1.
# =============================================================================
# primus_quem decline — bounded sources only on the AIR làn.
# =============================================================================
#
# Decline rows (reject reason in each comment):
# 1. unbounded source — an unbounded `danh_sách` parameter has no static
# extent; the AIR gate fails closed:
# SEM059 first_match_unbounded_source (causa not_bounded)
# 2. tại coordinates — the multi-axis `tại [i]` form on the first-match
# head stays unsupported in v1 (honest decline, not a silent pass):
# SEM059 first_match_expression_unsupported
#
# Common mistakes:
# • expecting an unbounded `danh_sách` local to admit because its initializer
# is a literal — the route classifier sees the unbounded path type
# • expecting early-exit semantics to excuse the bound — admission needs
# the static extent for the first-live mask, not an unroll
#
# See also: primus_quem, ubi, danh_sách, tại
# =============================================================================
# 1. unbounded — danh_sách parameter has no static extent, declines not_bounded
@ radix làn "air"
hàm elige_infinita(danh_sách<f32> xs) → thập_phân ∪ rỗng_ty {
trả primus_quem(xs, ubi v { v > 0.0 })
}
# 2. tại coordinates — multi-axis first-match stays unsupported in v1
@ radix làn "air"
hàm elige_apud(tf32[4] a) → thập_phân ∪ rỗng_ty {
trả primus_quem(a tại [i], ubi v { v > 0.0 })
}Expected: compilation rejects this example.