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 FieldImpl {
let type: Type_
let value: Term
···
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 locals: [Value]
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]!
case let .cut(term: term, frame: frame):
return evaluate(term: term)
.plug(frame: evaluate(frame: frame))
···
// SPDX-License-Identifier: MPL-2.0
struct Evaluator {
+
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):
+
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))