Skip to content

Commit 955c05d

Browse files
committed
refactor(compiler): removed global runtime.interpreter variable
1 parent 5aace03 commit 955c05d

20 files changed

+111
-75
lines changed

external/docs/external-docs.go

+12-6
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@ import (
1010

1111
var _ runtime.ExternalDefinition = ExternalDocs{}
1212

13-
type ExternalDocs struct{}
13+
type ExternalDocs struct {
14+
inter *runtime.Interpreter
15+
}
16+
17+
func New(inter *runtime.Interpreter) ExternalDocs {
18+
return ExternalDocs{inter}
19+
}
1420

1521
func (e ExternalDocs) Lookup(name string, env *runtime.Environment, decl ast.Decl) (runtime.RuntimeValue, bool) {
1622
switch name {
@@ -32,12 +38,12 @@ func (e ExternalDocs) docsInspectValueFunction(env *runtime.Environment, decl as
3238
if err != nil {
3339
return nil, err
3440
}
35-
return docsInspectValue(value, env)
41+
return e.docsInspectValue(value, env)
3642
},
3743
)
3844
}
3945

40-
func docsInspectValue(value runtime.RuntimeValue, env *runtime.Environment) (runtime.RuntimeValue, *runtime.RuntimeError) {
46+
func (exdocs ExternalDocs) docsInspectValue(value runtime.RuntimeValue, env *runtime.Environment) (runtime.RuntimeValue, *runtime.RuntimeError) {
4147
switch value := value.(type) {
4248
case runtime.PreludeModule:
4349
sortedKeys := make([]string, 0, len(value.Module.Environment.Scope))
@@ -53,7 +59,7 @@ func docsInspectValue(value runtime.RuntimeValue, env *runtime.Environment) (run
5359
if err != nil {
5460
return nil, err
5561
}
56-
child, err := docsInspectValue(lazyChild, env)
62+
child, err := exdocs.docsInspectValue(lazyChild, env)
5763
if err != nil {
5864
return nil, err
5965
}
@@ -160,7 +166,7 @@ func docsInspectValue(value runtime.RuntimeValue, env *runtime.Environment) (run
160166
return nil, err
161167
}
162168

163-
enumCaseValueDocs, err := docsInspectValue(enumCase, env)
169+
enumCaseValueDocs, err := exdocs.docsInspectValue(enumCase, env)
164170
if err != nil {
165171
return nil, err
166172
}
@@ -213,7 +219,7 @@ func docsInspectValue(value runtime.RuntimeValue, env *runtime.Environment) (run
213219
})
214220

215221
case runtime.RuntimeType:
216-
decl, err := value.Declaration()
222+
decl, err := value.Declaration(exdocs.inter)
217223
if err != nil {
218224
return nil, err
219225
}

external/fs/external-fs.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@ import (
1010

1111
var _ ExternalDefinition = ExternalFS{}
1212

13-
type ExternalFS struct{}
13+
type ExternalFS struct {
14+
inter *Interpreter
15+
}
16+
17+
func New(inter *Interpreter) ExternalFS {
18+
return ExternalFS{inter}
19+
}
1420

1521
func (e ExternalFS) Lookup(name string, env *Environment, decl ast.Decl) (RuntimeValue, bool) {
1622
switch name {

external/os/external-os.go

+24-18
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,31 @@ package os
22

33
import (
44
"github.com/vknabel/lithia/ast"
5-
. "github.com/vknabel/lithia/runtime"
5+
"github.com/vknabel/lithia/runtime"
66
"github.com/vknabel/lithia/world"
77
)
88

9-
var _ ExternalDefinition = ExternalOS{}
9+
var _ runtime.ExternalDefinition = ExternalOS{}
1010

11-
type ExternalOS struct{}
11+
type ExternalOS struct {
12+
inter *runtime.Interpreter
13+
}
14+
15+
func New(inter *runtime.Interpreter) ExternalOS {
16+
return ExternalOS{inter}
17+
}
1218

13-
func (e ExternalOS) Lookup(name string, env *Environment, decl ast.Decl) (RuntimeValue, bool) {
19+
func (e ExternalOS) Lookup(name string, env *runtime.Environment, decl ast.Decl) (runtime.RuntimeValue, bool) {
1420
switch name {
1521
case "exit":
1622
return builtinOsExit(decl), true
1723
case "env":
1824
return builtinOsEnv(env, decl), true
1925
case "args":
2026
relevantArgs := world.Current.Args
21-
runtimeArgs := make([]RuntimeValue, len(relevantArgs))
27+
runtimeArgs := make([]runtime.RuntimeValue, len(relevantArgs))
2228
for i, arg := range relevantArgs {
23-
runtimeArgs[i] = PreludeString(arg)
29+
runtimeArgs[i] = runtime.PreludeString(arg)
2430
}
2531
list, err := env.MakeEagerList(runtimeArgs)
2632
if err != nil {
@@ -32,44 +38,44 @@ func (e ExternalOS) Lookup(name string, env *Environment, decl ast.Decl) (Runtim
3238
}
3339
}
3440

35-
func builtinOsExit(decl ast.Decl) PreludeExternFunction {
36-
return MakeExternFunction(
41+
func builtinOsExit(decl ast.Decl) runtime.PreludeExternFunction {
42+
return runtime.MakeExternFunction(
3743
decl,
38-
func(args []Evaluatable) (RuntimeValue, *RuntimeError) {
44+
func(args []runtime.Evaluatable) (runtime.RuntimeValue, *runtime.RuntimeError) {
3945
value, err := args[0].Evaluate()
4046
if err != nil {
4147
return nil, err
4248
}
43-
if code, ok := value.(PreludeInt); ok {
49+
if code, ok := value.(runtime.PreludeInt); ok {
4450
world.Current.Env.Exit(int(code))
4551
return value, nil
4652
} else {
47-
return nil, NewRuntimeErrorf("%s is not an int", value).CascadeDecl(decl)
53+
return nil, runtime.NewRuntimeErrorf("%s is not an int", value).CascadeDecl(decl)
4854
}
4955
},
5056
)
5157
}
5258

53-
func builtinOsEnv(prelude *Environment, decl ast.Decl) PreludeExternFunction {
54-
return MakeExternFunction(
59+
func builtinOsEnv(prelude *runtime.Environment, decl ast.Decl) runtime.PreludeExternFunction {
60+
return runtime.MakeExternFunction(
5561
decl,
56-
func(args []Evaluatable) (RuntimeValue, *RuntimeError) {
62+
func(args []runtime.Evaluatable) (runtime.RuntimeValue, *runtime.RuntimeError) {
5763
value, err := args[0].Evaluate()
5864
if err != nil {
5965
return nil, err.CascadeDecl(decl)
6066
}
61-
if key, ok := value.(PreludeString); ok {
67+
if key, ok := value.(runtime.PreludeString); ok {
6268
if env, ok := world.Current.Env.LookupEnv(string(key)); ok && env != "" {
63-
value, err := prelude.MakeDataRuntimeValue("Some", map[string]Evaluatable{
64-
"value": NewConstantRuntimeValue(PreludeString(env)),
69+
value, err := prelude.MakeDataRuntimeValue("Some", map[string]runtime.Evaluatable{
70+
"value": runtime.NewConstantRuntimeValue(runtime.PreludeString(env)),
6571
})
6672
return value, err.CascadeDecl(decl)
6773
} else {
6874
value, err := prelude.MakeEmptyDataRuntimeValue("None")
6975
return value, err.CascadeDecl(decl)
7076
}
7177
} else {
72-
return nil, NewRuntimeErrorf("%s is not a string", value).CascadeDecl(decl)
78+
return nil, runtime.NewRuntimeErrorf("%s is not a string", value).CascadeDecl(decl)
7379
}
7480
},
7581
)

external/rx/extern-rx-future-type.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ var RxFutureTypeRef = runtime.MakeRuntimeTypeRef("Future", "rx")
1414

1515
type RxFutureType struct {
1616
ast.DeclExternType
17+
exrx ExternalRx
1718
}
1819

1920
func (RxFutureType) RuntimeType() runtime.RuntimeTypeRef {
@@ -24,11 +25,11 @@ func (RxFutureType) String() string {
2425
return RxVariableTypeRef.String()
2526
}
2627

27-
func (t RxFutureType) Declaration() (ast.Decl, *runtime.RuntimeError) {
28+
func (t RxFutureType) Declaration(inter *runtime.Interpreter) (ast.Decl, *runtime.RuntimeError) {
2829
return t.DeclExternType, nil
2930
}
3031

31-
func (d RxFutureType) HasInstance(value runtime.RuntimeValue) (bool, *runtime.RuntimeError) {
32+
func (d RxFutureType) HasInstance(inter *runtime.Interpreter, value runtime.RuntimeValue) (bool, *runtime.RuntimeError) {
3233
if _, ok := value.(RxFuture); ok {
3334
return true, nil
3435
} else {
@@ -53,7 +54,7 @@ func (t RxFutureType) Call(arguments []runtime.Evaluatable, fromExpr ast.Expr) (
5354
return nil, err.CascadeDecl(t.DeclExternType)
5455
}
5556
if receive, ok := receive.(runtime.CallableRuntimeValue); ok {
56-
return MakeRxFuture(&t, receive), nil
57+
return t.exrx.MakeRxFuture(&t, receive), nil
5758
} else {
5859
return nil, runtime.NewRuntimeErrorf("%s is not callable", receive)
5960
}

external/rx/extern-rx-future.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ type RxFuture struct {
2525
storage *internalPromise
2626
}
2727

28-
func MakeRxFuture(futureType *RxFutureType, configure runtime.CallableRuntimeValue) RxFuture {
28+
func (rx ExternalRx) MakeRxFuture(futureType *RxFutureType, configure runtime.CallableRuntimeValue) RxFuture {
2929
future := RxFuture{
3030
futureType: futureType,
3131
storage: &internalPromise{
@@ -41,7 +41,7 @@ func MakeRxFuture(futureType *RxFutureType, configure runtime.CallableRuntimeVal
4141
return nil, err.CascadeDecl(futureType.DeclExternType)
4242
}
4343
resultTypeRef := runtime.MakeRuntimeTypeRef("Result", "results")
44-
isResult, err := resultTypeRef.HasInstance(value)
44+
isResult, err := resultTypeRef.HasInstance(rx.inter, value)
4545
if err != nil {
4646
return nil, err.CascadeDecl(futureType.DeclExternType)
4747
} else if !isResult {

external/rx/extern-rx-variable-type.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ func (RxVariableType) String() string {
2424
return RxVariableTypeRef.String()
2525
}
2626

27-
func (t RxVariableType) Declaration() (ast.Decl, *runtime.RuntimeError) {
27+
func (t RxVariableType) Declaration(inter *runtime.Interpreter) (ast.Decl, *runtime.RuntimeError) {
2828
return t.DeclExternType, nil
2929
}
3030

31-
func (d RxVariableType) HasInstance(value runtime.RuntimeValue) (bool, *runtime.RuntimeError) {
31+
func (d RxVariableType) HasInstance(inter *runtime.Interpreter, value runtime.RuntimeValue) (bool, *runtime.RuntimeError) {
3232
if _, ok := value.(RxVariable); ok {
3333
return true, nil
3434
} else {

external/rx/external-rx.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@ import (
77

88
var _ runtime.ExternalDefinition = ExternalRx{}
99

10-
type ExternalRx struct{}
10+
type ExternalRx struct {
11+
inter *runtime.Interpreter
12+
}
13+
14+
func New(inter *runtime.Interpreter) ExternalRx {
15+
return ExternalRx{inter}
16+
}
1117

1218
func (e ExternalRx) Lookup(name string, env *runtime.Environment, decl ast.Decl) (runtime.RuntimeValue, bool) {
1319
switch name {
@@ -19,7 +25,7 @@ func (e ExternalRx) Lookup(name string, env *runtime.Environment, decl ast.Decl)
1925
}
2026
case "Future":
2127
if decl, ok := decl.(ast.DeclExternType); ok {
22-
return RxFutureType{decl}, true
28+
return RxFutureType{decl, e}, true
2329
} else {
2430
panic("rx.Future must be an extern type")
2531
}

lithia.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import (
1010

1111
func NewDefaultInterpreter(referenceFile string, importRoots ...string) *runtime.Interpreter {
1212
inter := runtime.NewIsolatedInterpreter(referenceFile, importRoots...)
13-
inter.ExternalDefinitions["os"] = extos.ExternalOS{}
14-
inter.ExternalDefinitions["rx"] = extrx.ExternalRx{}
15-
inter.ExternalDefinitions["docs"] = extdocs.ExternalDocs{}
16-
inter.ExternalDefinitions["fs"] = extfs.ExternalFS{}
13+
inter.ExternalDefinitions["os"] = extos.New(inter)
14+
inter.ExternalDefinitions["rx"] = extrx.New(inter)
15+
inter.ExternalDefinitions["docs"] = extdocs.New(inter)
16+
inter.ExternalDefinitions["fs"] = extfs.New(inter)
1717
return inter
1818
}

runtime/external-prelude.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func (e ExternalPrelude) Lookup(name string, env *Environment, decl ast.Decl) (R
1414
switch name {
1515
case "Int":
1616
if externDecl, ok := decl.(ast.DeclExternType); ok {
17-
return MakePrimitiveExternType(externDecl, func(value RuntimeValue) (bool, *RuntimeError) {
17+
return MakePrimitiveExternType(externDecl, func(inter *Interpreter, value RuntimeValue) (bool, *RuntimeError) {
1818
_, ok := value.(PreludeInt)
1919
return ok, nil
2020
}), true
@@ -23,7 +23,7 @@ func (e ExternalPrelude) Lookup(name string, env *Environment, decl ast.Decl) (R
2323
}
2424
case "Float":
2525
if externDecl, ok := decl.(ast.DeclExternType); ok {
26-
return MakePrimitiveExternType(externDecl, func(value RuntimeValue) (bool, *RuntimeError) {
26+
return MakePrimitiveExternType(externDecl, func(inter *Interpreter, value RuntimeValue) (bool, *RuntimeError) {
2727
_, ok := value.(PreludeFloat)
2828
return ok, nil
2929
}), true
@@ -32,7 +32,7 @@ func (e ExternalPrelude) Lookup(name string, env *Environment, decl ast.Decl) (R
3232
}
3333
case "String":
3434
if externDecl, ok := decl.(ast.DeclExternType); ok {
35-
return MakePrimitiveExternType(externDecl, func(value RuntimeValue) (bool, *RuntimeError) {
35+
return MakePrimitiveExternType(externDecl, func(inter *Interpreter, value RuntimeValue) (bool, *RuntimeError) {
3636
_, ok := value.(PreludeString)
3737
return ok, nil
3838
}), true
@@ -41,7 +41,7 @@ func (e ExternalPrelude) Lookup(name string, env *Environment, decl ast.Decl) (R
4141
}
4242
case "Dict":
4343
if externDecl, ok := decl.(ast.DeclExternType); ok {
44-
return MakePrimitiveExternType(externDecl, func(value RuntimeValue) (bool, *RuntimeError) {
44+
return MakePrimitiveExternType(externDecl, func(inter *Interpreter, value RuntimeValue) (bool, *RuntimeError) {
4545
_, ok := value.(PreludeDict)
4646
return ok, nil
4747
}), true
@@ -50,15 +50,15 @@ func (e ExternalPrelude) Lookup(name string, env *Environment, decl ast.Decl) (R
5050
}
5151
case "Char":
5252
if externDecl, ok := decl.(ast.DeclExternType); ok {
53-
return MakePrimitiveExternType(externDecl, func(value RuntimeValue) (bool, *RuntimeError) {
53+
return MakePrimitiveExternType(externDecl, func(inter *Interpreter, value RuntimeValue) (bool, *RuntimeError) {
5454
panic("char https://github.com/vknabel/lithia/issues/23")
5555
}), true
5656
} else {
5757
return nil, false
5858
}
5959
case "Function":
6060
if externDecl, ok := decl.(ast.DeclExternType); ok {
61-
return MakePrimitiveExternType(externDecl, func(value RuntimeValue) (bool, *RuntimeError) {
61+
return MakePrimitiveExternType(externDecl, func(inter *Interpreter, value RuntimeValue) (bool, *RuntimeError) {
6262
_, ok := value.(CallableRuntimeValue)
6363
return ok, nil
6464
}), true
@@ -67,7 +67,7 @@ func (e ExternalPrelude) Lookup(name string, env *Environment, decl ast.Decl) (R
6767
}
6868
case "Module":
6969
if externDecl, ok := decl.(ast.DeclExternType); ok {
70-
return MakePrimitiveExternType(externDecl, func(value RuntimeValue) (bool, *RuntimeError) {
70+
return MakePrimitiveExternType(externDecl, func(inter *Interpreter, value RuntimeValue) (bool, *RuntimeError) {
7171
_, ok := value.(PreludeModule)
7272
return ok, nil
7373
}), true
@@ -76,7 +76,7 @@ func (e ExternalPrelude) Lookup(name string, env *Environment, decl ast.Decl) (R
7676
}
7777
case "Any":
7878
if externDecl, ok := decl.(ast.DeclExternType); ok {
79-
return MakePrimitiveExternType(externDecl, func(value RuntimeValue) (bool, *RuntimeError) {
79+
return MakePrimitiveExternType(externDecl, func(inter *Interpreter, value RuntimeValue) (bool, *RuntimeError) {
8080
return true, nil
8181
}), true
8282
} else {

runtime/interpreter.go

-3
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import (
77
"github.com/vknabel/lithia/world"
88
)
99

10-
var interpreter *Interpreter
11-
1210
type Interpreter struct {
1311
Resolver resolution.ModuleResolver
1412
Parser *parser.Parser
@@ -25,7 +23,6 @@ func NewIsolatedInterpreter(referenceFile string, importRoots ...string) *Interp
2523
ExternalDefinitions: make(map[ast.ModuleName]ExternalDefinition),
2624
}
2725
inter.ExternalDefinitions["prelude"] = ExternalPrelude{}
28-
interpreter = inter
2926
return inter
3027
}
3128

runtime/operators-binary.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ func (ex *InterpreterContext) lazyLogicComparision(
256256
// // moduleName: "prelude",
257257
// // typeValue: &trueTypeValue,
258258
// // }
259-
if ok, err := boolRef.HasInstance(left); !ok || err != nil {
259+
if ok, err := boolRef.HasInstance(ex.interpreter, left); !ok || err != nil {
260260
if err != nil {
261261
return nil, err
262262
}
@@ -268,7 +268,7 @@ func (ex *InterpreterContext) lazyLogicComparision(
268268
}
269269

270270
trueRef := MakeRuntimeTypeRef("True", "prelude")
271-
isLeftTrue, err := trueRef.HasInstance(left)
271+
isLeftTrue, err := trueRef.HasInstance(ex.interpreter, left)
272272
if err != nil {
273273
return nil, NewRuntimeError(err)
274274
}
@@ -278,7 +278,7 @@ func (ex *InterpreterContext) lazyLogicComparision(
278278
if err != nil {
279279
return false, nil
280280
}
281-
isRightTrue, err := trueRef.HasInstance(right)
281+
isRightTrue, err := trueRef.HasInstance(ex.interpreter, right)
282282
if err != nil {
283283
return false, nil
284284
}

0 commit comments

Comments
 (0)