Skip to content

Commit 1d52821

Browse files
committed
repl starts up with AOT
Signed-off-by: James Hamlin <jfhamlin@gmail.com>
1 parent 0f531a4 commit 1d52821

File tree

10 files changed

+929
-804
lines changed

10 files changed

+929
-804
lines changed

Makefile

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,8 @@ gocmd:
3030
.PHONY: generate
3131
generate:
3232
@go generate ./...
33-
@echo "(compile 'glojure.core)" | GLOJURE_STDLIB_PATH=./pkg/stdlib $(GO_CMD) run ./cmd/glj
34-
@echo "(compile 'glojure.core.async)" | GLOJURE_STDLIB_PATH=./pkg/stdlib $(GO_CMD) run ./cmd/glj
35-
@echo "(compile 'glojure.protocols)" | GLOJURE_STDLIB_PATH=./pkg/stdlib $(GO_CMD) run ./cmd/glj
33+
@echo "(map compile '[glojure.core glojure.core.async])" | \
34+
GLOJURE_STDLIB_PATH=./pkg/stdlib $(GO_CMD) run ./cmd/glj
3635

3736
pkg/gen/gljimports/gljimports_%.go: ./scripts/gen-gljimports.sh ./cmd/gen-import-interop/main.go ./internal/genpkg/genpkg.go \
3837
$(wildcard ./pkg/lang/*.go) $(wildcard ./pkg/runtime/*.go)

pkg/lang/ifn.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func (f FnFunc) Invoke(args ...any) any {
2121
}
2222

2323
func (f FnFunc) ApplyTo(args ISeq) any {
24-
return f.fn(seqToSlice(args))
24+
return f.fn(seqToSlice(args)...)
2525
}
2626

2727
func (f FnFunc) Meta() IPersistentMap {

pkg/runtime/codegen.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,13 @@ runtime.RegisterNSLoader(` + fmt.Sprintf("%q", rootResourceName) + `, LoadNS)
222222
}
223223
}
224224
225+
`)
226+
initBuf.WriteString(`func checkArityGTE(args []any, min int) {
227+
if len(args) < min {
228+
panic(lang.NewIllegalArgumentError("wrong number of arguments (" + fmt.Sprint(len(args)) + ")"))
229+
}
230+
}
231+
225232
`)
226233
initBuf.WriteString(fmt.Sprintf("// LoadNS initializes the namespace %q\n", ns.Name().String()))
227234
initBuf.WriteString("func LoadNS() {\n")
@@ -380,11 +387,15 @@ func (g *Generator) generateVar(nsVariableName string, name *lang.Symbol, vr *la
380387

381388
meta := vr.Meta()
382389
varSym := g.allocateTempVar()
390+
var isDynamic bool
383391
if lang.IsNil(meta) {
384392
g.writef("%s := %s\n", varSym, g.allocSymVar(name.String()))
385393
} else {
386394
metaVariable := g.generateValue(meta)
387395
g.writef("%s := %s.WithMeta(%s).(*lang.Symbol)\n", varSym, g.allocSymVar(name.String()), metaVariable)
396+
if RT.BooleanCast(lang.Get(meta, lang.KWDynamic)) {
397+
isDynamic = true
398+
}
388399
}
389400

390401
// check if the var has a value
@@ -400,6 +411,9 @@ func (g *Generator) generateVar(nsVariableName string, name *lang.Symbol, vr *la
400411
g.writef("\t%s.SetMeta(%s.Meta().(lang.IPersistentMap))\n", varVar, varSym)
401412
g.writef("}\n")
402413
}
414+
if isDynamic {
415+
g.writef("%s.SetDynamic()\n", varVar)
416+
}
403417

404418
return nil
405419
}
@@ -503,6 +517,12 @@ func (g *Generator) generateTypeValue(t reflect.Type) string {
503517
// generateZeroValueExpr generates a Go expression that creates a zero value
504518
// of the given type, handling package imports as needed
505519
func (g *Generator) generateZeroValueExpr(t reflect.Type) string {
520+
// TODO: review this LLM slop
521+
switch {
522+
case t == reflect.TypeOf(lang.NewChar('a')):
523+
return "lang.NewChar(0)"
524+
}
525+
506526
switch t.Kind() {
507527
case reflect.Bool:
508528
return "false"
@@ -744,6 +764,8 @@ func (g *Generator) generateSetValue(s lang.IPersistentSet) string {
744764
}
745765

746766
func (g *Generator) generateMultiFn(mf *lang.MultiFn) string {
767+
fmt.Println("Generating MultiFn:", mf.GetName())
768+
747769
// Allocate a variable for the MultiFn
748770
mfVar := g.allocateTempVar()
749771

@@ -757,6 +779,7 @@ func (g *Generator) generateMultiFn(mf *lang.MultiFn) string {
757779
hierarchyVar := g.generateValue(mf.GetHierarchy())
758780

759781
// Create the MultiFn
782+
g.writef("// MultiFn %s\n", mf.GetName())
760783
g.writef("%s := lang.NewMultiFn(%#v, %s, %s, %s)\n",
761784
mfVar, mf.GetName(), dispatchFnVar, defaultValVar, hierarchyVar)
762785

@@ -771,6 +794,8 @@ func (g *Generator) generateMultiFn(mf *lang.MultiFn) string {
771794
dispatchValVar := g.generateValue(dispatchVal)
772795
methodVar := g.generateValue(method)
773796

797+
fmt.Println("Adding method for dispatch value:", dispatchVal)
798+
774799
g.writef("%s.AddMethod(%s, %s)\n", mfVar, dispatchValVar, methodVar)
775800
}
776801
}
@@ -875,7 +900,7 @@ func (g *Generator) generateFn(fn *Fn) string {
875900
if variadicMethod != nil {
876901
variadicMethodNode := variadicMethod.Sub.(*ast.FnMethodNode)
877902
g.writef(" default:\n")
878-
g.writef("checkArity(args, %d)\n", variadicMethodNode.FixedArity)
903+
g.writef("checkArityGTE(args, %d)\n", variadicMethodNode.FixedArity)
879904
g.generateFnMethod(variadicMethodNode, "args")
880905
} else {
881906
// No variadic method - error on any other arity

pkg/runtime/rtcompat.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,12 +149,10 @@ func (rt *RTMethods) Load(scriptBase string) {
149149
if useAot {
150150
// check nsloaders
151151
if loader := GetNSLoader(strings.TrimPrefix(scriptBase, "/")); loader != nil {
152-
fmt.Printf("Using custom loader for %s\n", scriptBase)
153152
loader()
154153
return
155154
}
156155
}
157-
fmt.Printf("Loading %s\n", scriptBase)
158156

159157
filename := scriptBase + ".glj"
160158

pkg/runtime/testdata/codegen/test/core/load.go.out

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8455,7 +8455,7 @@ func LoadNS() {
84558455
v3 := args[0]
84568456
_ = v3
84578457
tmp4 := checkDerefVar(var_glojure_DOT_core_instance_QMARK_)
8458-
tmp5 := reflect.TypeOf(int32(0))
8458+
tmp5 := reflect.TypeOf(lang.NewChar(0))
84598459
tmp6 := lang.Apply(tmp4, []any{tmp5, v3})
84608460
return tmp6
84618461
})
@@ -48721,6 +48721,7 @@ func LoadNS() {
4872148721
return tmp8
4872248722
}
4872348723
})
48724+
// MultiFn coll-reduce
4872448725
tmp3 := lang.NewMultiFn("coll-reduce", tmp4, kw_default, lang.FindOrCreateNamespace(sym_glojure_DOT_core).FindInternedVar(sym_global_DASH_hierarchy))
4872548726
var tmp5 lang.FnFunc
4872648727
tmp5 = lang.NewFnFunc(func(args ...any) any {
@@ -48808,6 +48809,7 @@ func LoadNS() {
4880848809
return tmp18
4880948810
}
4881048811
})
48812+
// MultiFn internal-reduce
4881148813
tmp13 := lang.NewMultiFn("internal-reduce", tmp14, kw_default, lang.FindOrCreateNamespace(sym_glojure_DOT_core).FindInternedVar(sym_global_DASH_hierarchy))
4881248814
var tmp15 lang.FnFunc
4881348815
tmp15 = lang.NewFnFunc(func(args ...any) any {
@@ -48877,6 +48879,7 @@ func LoadNS() {
4887748879
return tmp26
4887848880
}
4887948881
})
48882+
// MultiFn kv-reduce
4888048883
tmp21 := lang.NewMultiFn("kv-reduce", tmp22, kw_default, lang.FindOrCreateNamespace(sym_glojure_DOT_core).FindInternedVar(sym_global_DASH_hierarchy))
4888148884
tmp20 := lang.NewAtom(lang.NewMap(kw_multis, lang.NewMap(kw_kv_DASH_reduce, tmp21), kw_on_DASH_interface, true, kw_sigs, lang.NewList(lang.NewList(sym_kv_DASH_reduce, lang.NewVector(sym_amap, sym_f, sym_init)))))
4888248885
var tmp25 lang.FnFunc
@@ -48893,6 +48896,7 @@ func LoadNS() {
4889348896
return tmp29
4889448897
}
4889548898
})
48899+
// MultiFn datafy
4889648900
tmp24 := lang.NewMultiFn("datafy", tmp25, kw_default, lang.FindOrCreateNamespace(sym_glojure_DOT_core).FindInternedVar(sym_global_DASH_hierarchy))
4889748901
var tmp26 lang.FnFunc
4889848902
tmp26 = lang.NewFnFunc(func(args ...any) any {
@@ -48926,6 +48930,7 @@ func LoadNS() {
4892648930
return tmp33
4892748931
}
4892848932
})
48933+
// MultiFn nav
4892948934
tmp28 := lang.NewMultiFn("nav", tmp29, kw_default, lang.FindOrCreateNamespace(sym_glojure_DOT_core).FindInternedVar(sym_global_DASH_hierarchy))
4893048935
tmp27 := lang.NewAtom(lang.NewMap(kw_multis, lang.NewMap(kw_nav, tmp28), kw_on_DASH_interface, true, kw_sigs, lang.NewList(lang.NewList(sym_nav, lang.NewVector(sym_coll, sym_k, sym_v), "return (possibly transformed) v in the context of coll and k (a key/index or nil),\ndefaults to returning v."))))
4893148936
var tmp32 lang.FnFunc
@@ -48942,6 +48947,7 @@ func LoadNS() {
4894248947
return tmp36
4894348948
}
4894448949
})
48950+
// MultiFn make-reader
4894548951
tmp31 := lang.NewMultiFn("make-reader", tmp32, kw_default, lang.FindOrCreateNamespace(sym_glojure_DOT_core).FindInternedVar(sym_global_DASH_hierarchy))
4894648952
tmp33 := reflect.TypeOf((*io4.Reader)(nil)).Elem()
4894748953
var tmp34 lang.FnFunc
@@ -49011,6 +49017,7 @@ func LoadNS() {
4901149017
return tmp44
4901249018
}
4901349019
})
49020+
// MultiFn make-writer
4901449021
tmp39 := lang.NewMultiFn("make-writer", tmp40, kw_default, lang.FindOrCreateNamespace(sym_glojure_DOT_core).FindInternedVar(sym_global_DASH_hierarchy))
4901549022
tmp41 := reflect.TypeOf((*io4.Reader)(nil)).Elem()
4901649023
var tmp42 lang.FnFunc
@@ -49080,6 +49087,7 @@ func LoadNS() {
4908049087
return tmp52
4908149088
}
4908249089
})
49090+
// MultiFn make-input-stream
4908349091
tmp47 := lang.NewMultiFn("make-input-stream", tmp48, kw_default, lang.FindOrCreateNamespace(sym_glojure_DOT_core).FindInternedVar(sym_global_DASH_hierarchy))
4908449092
tmp49 := reflect.TypeOf((*io4.Reader)(nil)).Elem()
4908549093
var tmp50 lang.FnFunc
@@ -49167,6 +49175,7 @@ func LoadNS() {
4916749175
return tmp62
4916849176
}
4916949177
})
49178+
// MultiFn make-output-stream
4917049179
tmp57 := lang.NewMultiFn("make-output-stream", tmp58, kw_default, lang.FindOrCreateNamespace(sym_glojure_DOT_core).FindInternedVar(sym_global_DASH_hierarchy))
4917149180
tmp59 := reflect.TypeOf((*io4.Reader)(nil)).Elem()
4917249181
var tmp60 lang.FnFunc
@@ -54640,6 +54649,7 @@ func LoadNS() {
5464054649
return tmp6
5464154650
})
5464254651
tmp2 = tmp2.WithMeta(lang.NewMap(kw_file, "glojure/core.glj", kw_line, int(3667), kw_column, int(21), kw_end_DASH_line, int(3667), kw_end_DASH_column, int(45))).(lang.FnFunc)
54652+
// MultiFn print-dup
5464354653
tmp1 := lang.NewMultiFn("print-dup", tmp2, kw_default, lang.FindOrCreateNamespace(sym_glojure_DOT_core).FindInternedVar(sym_global_DASH_hierarchy))
5464454654
var tmp3 lang.FnFunc
5464554655
tmp3 = lang.NewFnFunc(func(args ...any) any {
@@ -54854,7 +54864,7 @@ func LoadNS() {
5485454864
return tmp40
5485554865
})
5485654866
tmp1.AddMethod(tmp24, tmp25)
54857-
tmp26 := reflect.TypeOf(int32(0))
54867+
tmp26 := reflect.TypeOf(lang.NewChar(0))
5485854868
var tmp27 lang.FnFunc
5485954869
tmp27 = lang.NewFnFunc(func(args ...any) any {
5486054870
checkArity(args, 2)
@@ -55136,6 +55146,7 @@ func LoadNS() {
5513655146
return tmp5
5513755147
})
5513855148
tmp2 = tmp2.WithMeta(lang.NewMap(kw_file, "glojure/core.glj", kw_line, int(3664), kw_column, int(24), kw_end_DASH_line, int(3666), kw_end_DASH_column, int(58))).(lang.FnFunc)
55149+
// MultiFn print-method
5513955150
tmp1 := lang.NewMultiFn("print-method", tmp2, kw_default, lang.FindOrCreateNamespace(sym_glojure_DOT_core).FindInternedVar(sym_global_DASH_hierarchy))
5514055151
var tmp3 lang.FnFunc
5514155152
tmp3 = lang.NewFnFunc(func(args ...any) any {
@@ -55441,7 +55452,7 @@ func LoadNS() {
5544155452
return nil
5544255453
})
5544355454
tmp1.AddMethod(tmp19, tmp20)
55444-
tmp21 := reflect.TypeOf(int32(0))
55455+
tmp21 := reflect.TypeOf(lang.NewChar(0))
5544555456
var tmp22 lang.FnFunc
5544655457
tmp22 = lang.NewFnFunc(func(args ...any) any {
5544755458
checkArity(args, 2)

0 commit comments

Comments
 (0)