pub enum CoreKind {
Show 14 variants
Const(Const),
Var(VarId),
Global(Arc<str>),
Lam {
params: Arc<[VarId]>,
body: Arc<Core>,
},
App {
func: Box<Core>,
args: Vec<Core>,
},
Prim {
op: Prim,
args: Vec<Core>,
},
Let {
var: VarId,
value: Box<Core>,
body: Box<Core>,
},
If {
cond: Box<Core>,
then: Box<Core>,
alt: Box<Core>,
},
Match {
scrutinee: Box<Core>,
arms: Vec<Arm>,
},
Make {
ty: Arc<str>,
variant: Option<Arc<str>>,
fields: Vec<(Arc<str>, Core)>,
},
Field {
base: Box<Core>,
name: Arc<str>,
},
With {
base: Box<Core>,
fields: Vec<(Arc<str>, Core)>,
},
ListLit(Vec<Core>),
MapLit(Vec<(Core, Core)>),
}Variants§
Const(Const)
Var(VarId)
Global(Arc<str>)
A reference to a top-level definition.
Lam
Fields
§
params: Arc<[VarId]>Shared for the same reason body is: evaluating a lam hands the list to a closure,
and a refcount bump is cheaper than copying it once per call.
§
body: Arc<Core>Shared, not owned: a closure is built every time a lam node is evaluated, and a
Box meant deep-copying the whole function body each time. docs/73 §73.1 measured
20,000 calls to a function whose executed path never changed costing 42 ms, 227 ms and
606 ms as the unexecuted part of its body grew.
App
Prim
Let
If
Match
Make
Construct a union variant or a model record.
Field
With
t.with(done=not t.done) — a functional record update. The sketch’s
(set t :done (not t.done)), and the reason Todo never needs a mutable binding.
ListLit(Vec<Core>)
MapLit(Vec<(Core, Core)>)
Trait Implementations§
Auto Trait Implementations§
impl Freeze for CoreKind
impl RefUnwindSafe for CoreKind
impl Send for CoreKind
impl Sync for CoreKind
impl Unpin for CoreKind
impl UnwindSafe for CoreKind
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more