Make global names evaluate to glued neutrals

To do this, it was necessary to store types of globals (which we will need to
do anyway). Also, in order to forestall the "Goodbye Lenin" problem, I am
storing globals as terms rather than as values.

Changed files
+27 -2
Sources
PterodactylKernel
+5
Sources/PterodactylKernel/Core Types/Term.swift
···
let manifest: Term?
}
+
struct TypedTerm {
+
let type: Type_
+
let term: Term
+
}
+
struct FieldImpl {
let type: Type_
let value: Term
+22 -2
Sources/PterodactylKernel/Evaluator.swift
···
// SPDX-License-Identifier: MPL-2.0
struct Evaluator {
-
let globals: [Name: Value]
+
let globals: [Name: Term.TypedTerm]
let locals: [Value]
+
+
init(globals: [Name : Term.TypedTerm], locals: [Value]) {
+
self.globals = globals
+
self.locals = locals
+
}
+
+
init() {
+
self.init(globals: [:], locals: [])
+
}
func extendedBy(value: Value) -> Self {
Self(globals: globals, locals: CollectionOfOne(value) + locals)
···
case let .local(index: index):
return locals[index]
case let .global(name: name):
-
return globals[name]!
+
let neutral = Value.Neutral(
+
head: .global(name: name),
+
spine: [],
+
boundary: AsyncThunk {
+
let typedTerm = globals[name]!
+
return Value.Boundary(
+
type: evaluate(type: typedTerm.type),
+
value: evaluate(term: typedTerm.term)
+
)
+
}
+
)
+
return .shift(neutral: neutral)
case let .cut(term: term, frame: frame):
return evaluate(term: term)
.plug(frame: evaluate(frame: frame))