Skip to content

Commit acc2d00

Browse files
authored
Retain clojure.* name for standard namespaces (#107)
* Split go generate and aot into separate make commands Signed-off-by: James Hamlin <[email protected]> * Retain clojure.* name for standard namespaces Completes #52 and #53 Signed-off-by: James Hamlin <[email protected]> * AOT compile clojure.core.protocols to go Signed-off-by: James Hamlin <[email protected]> --------- Signed-off-by: James Hamlin <[email protected]>
1 parent c4b0f57 commit acc2d00

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+13939
-74897
lines changed

Makefile

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ STDLIB_ORIGINALS_DIR := scripts/rewrite-core/originals
44
STDLIB_ORIGINALS := $(shell find $(STDLIB_ORIGINALS_DIR) -name '*.clj')
55
STDLIB := $(STDLIB_ORIGINALS:scripts/rewrite-core/originals/%=%)
66
STDLIB_ORIGINALS := $(addprefix scripts/rewrite-core/originals/,$(STDLIB))
7-
STDLIB_TARGETS := $(addprefix pkg/stdlib/glojure/,$(STDLIB:.clj=.glj))
7+
STDLIB_TARGETS := $(addprefix pkg/stdlib/clojure/,$(STDLIB:.clj=.glj))
88

99
OS-TYPE := $(shell bash -c 'echo $$OSTYPE')
1010
OS-NAME := \
@@ -41,19 +41,22 @@ GO_VERSION := 1.19.3
4141
GO_CMD := go$(GO_VERSION)
4242

4343
.PHONY: all
44-
all: gocmd $(STDLIB_TARGETS) generate $(GLJIMPORTS) $(BINS)
44+
all: gocmd $(STDLIB_TARGETS) go-generate aot $(GLJIMPORTS) $(BINS)
4545

4646
.PHONY: gocmd
4747
gocmd:
4848
@$(GO_CMD) version 2>&1 > /dev/null || \
4949
(go install "golang.org/dl/$(GO_CMD)@latest" && \
5050
$(GO_CMD) download > /dev/null && $(GO_CMD) version > /dev/null)
5151

52-
.PHONY: generate
52+
.PHONY: go-generate
5353
generate:
5454
@go generate ./...
55-
@echo "(map compile '[glojure.core glojure.go.io glojure.core.async glojure.walk glojure.template glojure.go.types glojure.uuid])" | \
56-
GLOJURE_USE_AOT=false GLOJURE_STDLIB_PATH=./pkg/stdlib $(GO_CMD) run ./cmd/glj
55+
56+
.PHONY: aot
57+
aot: gocmd $(STDLIB_TARGETS)
58+
@echo "(map compile '[clojure.core clojure.core.async clojure.walk clojure.template clojure.uuid glojure.go.types glojure.go.io])" | \
59+
GLOJURE_USE_AOT=false GLOJURE_STDLIB_PATH=./pkg/stdlib $(GO_CMD) run -tags glj_no_aot_stdlib ./cmd/glj
5760

5861
.PHONY: build
5962
build: $(GLJ)
@@ -67,7 +70,7 @@ pkg/gen/gljimports/gljimports_%.go: ./scripts/gen-gljimports.sh ./cmd/gen-import
6770
@echo "Generating $@"
6871
@./scripts/gen-gljimports.sh $@ $* $(GO_CMD)
6972

70-
pkg/stdlib/glojure/%.glj: scripts/rewrite-core/originals/%.clj scripts/rewrite-core/run.sh scripts/rewrite-core/rewrite.clj
73+
pkg/stdlib/clojure/%.glj: scripts/rewrite-core/originals/%.clj scripts/rewrite-core/run.sh scripts/rewrite-core/rewrite.clj
7174
@echo "Rewriting $< to $@"
7275
@mkdir -p $(dir $@)
7376
@scripts/rewrite-core/run.sh $< > $@

pkg/glj/glj_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import (
77
)
88

99
func TestGLJ(t *testing.T) {
10-
mp := Var("glojure.core", "map")
11-
inc := Var("glojure.core", "inc")
10+
mp := Var("clojure.core", "map")
11+
inc := Var("clojure.core", "inc")
1212
res := lang.PrintString(mp.Invoke(inc, Read("[1 2 3]")))
1313
if res != "(2 3 4)" {
1414
t.Errorf("Expected (2 3 4), got %v", res)

pkg/glj/init-aot.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ package glj
44

55
import (
66
// Add NS loaders for the standard library.
7-
_ "github.com/glojurelang/glojure/pkg/stdlib/glojure/core"
8-
_ "github.com/glojurelang/glojure/pkg/stdlib/glojure/core/async"
7+
_ "github.com/glojurelang/glojure/pkg/stdlib/clojure/core"
8+
_ "github.com/glojurelang/glojure/pkg/stdlib/clojure/core/async"
9+
_ "github.com/glojurelang/glojure/pkg/stdlib/clojure/core/protocols"
910
_ "github.com/glojurelang/glojure/pkg/stdlib/glojure/go/io"
10-
_ "github.com/glojurelang/glojure/pkg/stdlib/glojure/protocols"
1111
)

pkg/gljmain/gljmain.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func Main(args []string) {
5757
env := lang.GlobalEnv
5858

5959
// Set command line args (everything after -e and the expression)
60-
core := lang.FindNamespace(lang.NewSymbol("glojure.core"))
60+
core := lang.FindNamespace(lang.NewSymbol("clojure.core"))
6161
core.FindInternedVar(lang.NewSymbol("*command-line-args*")).BindRoot(lang.Seq(args[2:]))
6262

6363
rdr := reader.New(strings.NewReader(expr), reader.WithGetCurrentNS(func() *lang.Namespace {
@@ -90,7 +90,7 @@ func Main(args []string) {
9090
}
9191
env := lang.GlobalEnv
9292

93-
core := lang.FindNamespace(lang.NewSymbol("glojure.core"))
93+
core := lang.FindNamespace(lang.NewSymbol("clojure.core"))
9494
core.FindInternedVar(lang.NewSymbol("*command-line-args*")).BindRoot(lang.Seq(args[1:]))
9595

9696
rdr := reader.New(bufio.NewReader(file), reader.WithGetCurrentNS(func() *lang.Namespace {

pkg/lang/namespace.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ type Namespace struct {
2121
}
2222

2323
var (
24-
SymbolCoreNamespace = NewSymbol("glojure.core")
24+
SymbolCoreNamespace = NewSymbol("clojure.core")
2525

2626
namespaces = map[string]*Namespace{}
2727
nsMtx sync.RWMutex
@@ -60,8 +60,8 @@ func FindOrCreateNamespace(sym *Symbol) *Namespace {
6060
}
6161

6262
func RemoveNamespace(sym *Symbol) {
63-
if sym.String() == "glojure.core" {
64-
panic(errors.New("cannot remove glojure.core namespace"))
63+
if sym.String() == "clojure.core" {
64+
panic(errors.New("cannot remove clojure.core namespace"))
6565
}
6666

6767
nsMtx.Lock()

pkg/reader/reader.go

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ import (
1515

1616
var (
1717
symQuote = lang.NewSymbol("quote")
18-
symList = lang.NewSymbol("glojure.core/list")
19-
symSeq = lang.NewSymbol("glojure.core/seq")
20-
symConcat = lang.NewSymbol("glojure.core/concat")
21-
symUnquote = lang.NewSymbol("glojure.core/unquote")
22-
symSpliceUnquote = lang.NewSymbol("glojure.core/splice-unquote")
18+
symList = lang.NewSymbol("clojure.core/list")
19+
symSeq = lang.NewSymbol("clojure.core/seq")
20+
symConcat = lang.NewSymbol("clojure.core/concat")
21+
symUnquote = lang.NewSymbol("clojure.core/unquote")
22+
symSpliceUnquote = lang.NewSymbol("clojure.core/splice-unquote")
2323

2424
specials = func() map[string]bool {
2525
specialStrs := []string{
@@ -34,7 +34,7 @@ var (
3434
"fn*",
3535
"quote",
3636
"var",
37-
"glojure.core/import*",
37+
"clojure.core/import*",
3838
".",
3939
"set!",
4040
"deftype*",
@@ -802,12 +802,12 @@ func (r *Reader) syntaxQuote(symbolNameMap map[string]*lang.Symbol, node interfa
802802
keyvals = append(keyvals, entry.Key(), entry.Val())
803803
}
804804
return lang.NewList(
805-
lang.NewSymbol("glojure.core/apply"),
806-
lang.NewSymbol("glojure.core/hash-map"),
805+
lang.NewSymbol("clojure.core/apply"),
806+
lang.NewSymbol("clojure.core/hash-map"),
807807
lang.NewList(
808-
lang.NewSymbol("glojure.core/seq"),
808+
lang.NewSymbol("clojure.core/seq"),
809809
lang.NewCons(
810-
lang.NewSymbol("glojure.core/concat"),
810+
lang.NewSymbol("clojure.core/concat"),
811811
r.sqExpandList(symbolNameMap, keyvals),
812812
),
813813
),
@@ -816,14 +816,14 @@ func (r *Reader) syntaxQuote(symbolNameMap map[string]*lang.Symbol, node interfa
816816
_, isVector := node.(lang.IPersistentVector)
817817
if lang.Count(node) == 0 {
818818
if isVector {
819-
//(glojure.core/apply glojure.core/vector (glojure.core/seq (glojure.core/concat)))
819+
//(clojure.core/apply clojure.core/vector (clojure.core/seq (clojure.core/concat)))
820820
return lang.NewList(
821-
lang.NewSymbol("glojure.core/apply"),
822-
lang.NewSymbol("glojure.core/vector"),
821+
lang.NewSymbol("clojure.core/apply"),
822+
lang.NewSymbol("clojure.core/vector"),
823823
lang.NewList(
824-
lang.NewSymbol("glojure.core/seq"),
824+
lang.NewSymbol("clojure.core/seq"),
825825
lang.NewList(
826-
lang.NewSymbol("glojure.core/concat"),
826+
lang.NewSymbol("clojure.core/concat"),
827827
),
828828
),
829829
)
@@ -848,8 +848,8 @@ func (r *Reader) syntaxQuote(symbolNameMap map[string]*lang.Symbol, node interfa
848848
lang.NewList(elements...))
849849
if isVector {
850850
ret = lang.NewList(
851-
lang.NewSymbol("glojure.core/apply"),
852-
lang.NewSymbol("glojure.core/vector"),
851+
lang.NewSymbol("clojure.core/apply"),
852+
lang.NewSymbol("clojure.core/vector"),
853853
ret)
854854
}
855855
return ret
@@ -861,11 +861,11 @@ func (r *Reader) sqExpandList(symbolNameMap map[string]*lang.Symbol, els []inter
861861
var ret lang.IPersistentVector = lang.NewVector()
862862
for _, v := range els {
863863
if r.isUnquote(v) {
864-
ret = ret.Cons(lang.NewList(lang.NewSymbol("glojure.core/list"), lang.First(lang.Rest(v)))).(lang.IPersistentVector)
864+
ret = ret.Cons(lang.NewList(lang.NewSymbol("clojure.core/list"), lang.First(lang.Rest(v)))).(lang.IPersistentVector)
865865
} else if r.isUnquoteSplicing(v) {
866866
ret = ret.Cons(lang.First(lang.Rest(v))).(lang.IPersistentVector)
867867
} else {
868-
ret = ret.Cons(lang.NewList(lang.NewSymbol("glojure.core/list"), r.syntaxQuote(symbolNameMap, v))).(lang.IPersistentVector)
868+
ret = ret.Cons(lang.NewList(lang.NewSymbol("clojure.core/list"), r.syntaxQuote(symbolNameMap, v))).(lang.IPersistentVector)
869869
}
870870
}
871871
return lang.Seq(ret)
@@ -883,8 +883,8 @@ func (r *Reader) isUnquoteSplicing(form interface{}) bool {
883883

884884
func (r *Reader) readDeref() (interface{}, error) {
885885
// TODO: look up 'deref' with the symbol resolver
886-
// it should resolve to glojure.core/deref in the go case
887-
return r.readQuoteType("glojure.core/deref")
886+
// it should resolve to clojure.core/deref in the go case
887+
return r.readQuoteType("clojure.core/deref")
888888
}
889889

890890
func (r *Reader) readUnquote() (interface{}, error) {
@@ -893,11 +893,11 @@ func (r *Reader) readUnquote() (interface{}, error) {
893893
return nil, r.error("error reading input: %w", err)
894894
}
895895
if rn == '@' {
896-
return r.readQuoteType("glojure.core/splice-unquote")
896+
return r.readQuoteType("clojure.core/splice-unquote")
897897
}
898898

899899
r.rs.UnreadRune()
900-
return r.readQuoteType("glojure.core/unquote")
900+
return r.readQuoteType("clojure.core/unquote")
901901
}
902902

903903
func (r *Reader) readDispatch() (interface{}, error) {
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
(quote user/foobar)
2-
(glojure.core/list)
3-
(glojure.core/seq (glojure.core/concat (glojure.core/list (quote user/a)) (glojure.core/list (quote user/b)) (glojure.core/list (quote user/c))))
4-
(glojure.core/seq (glojure.core/concat (glojure.core/list (quote user/a)) (glojure.core/list (+ 1 2))))
5-
(glojure.core/seq (glojure.core/concat (glojure.core/list (quote user/a)) [(+ 1 2)]))
6-
(glojure.core/seq (glojure.core/concat (glojure.core/list (quote do.not.Qualify))))
7-
(glojure.core/apply glojure.core/hash-map (glojure.core/seq (glojure.core/concat (glojure.core/list :x) (glojure.core/list []))))
8-
(glojure.core/seq (glojure.core/concat (glojure.core/list (quote resolved.alias/foo))))
2+
(clojure.core/list)
3+
(clojure.core/seq (clojure.core/concat (clojure.core/list (quote user/a)) (clojure.core/list (quote user/b)) (clojure.core/list (quote user/c))))
4+
(clojure.core/seq (clojure.core/concat (clojure.core/list (quote user/a)) (clojure.core/list (+ 1 2))))
5+
(clojure.core/seq (clojure.core/concat (clojure.core/list (quote user/a)) [(+ 1 2)]))
6+
(clojure.core/seq (clojure.core/concat (clojure.core/list (quote do.not.Qualify))))
7+
(clojure.core/apply clojure.core/hash-map (clojure.core/seq (clojure.core/concat (clojure.core/list :x) (clojure.core/list []))))
8+
(clojure.core/seq (clojure.core/concat (clojure.core/list (quote resolved.alias/foo))))

pkg/runtime/codegen.go

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"go/format"
88
"io"
9+
"path/filepath"
910
"reflect"
1011
"sort"
1112
"strings"
@@ -84,9 +85,9 @@ type Generator struct {
8485
var (
8586
omittedVars = map[string]bool{
8687
// initialized by the runtime
87-
"#'glojure.core/*in*": true,
88-
"#'glojure.core/*out*": true,
89-
"#'glojure.core/*compile-files*": true,
88+
"#'clojure.core/*in*": true,
89+
"#'clojure.core/*out*": true,
90+
"#'clojure.core/*compile-files*": true,
9091
}
9192
)
9293

@@ -203,9 +204,7 @@ func (g *Generator) Generate(ns *lang.Namespace) error {
203204
var initBuf bytes.Buffer
204205
{
205206
// Reproduce the behavior of root-resource function
206-
rootResourceName := ns.Name().String()
207-
rootResourceName = strings.ReplaceAll(rootResourceName, "-", "_")
208-
rootResourceName = strings.ReplaceAll(rootResourceName, ".", "/")
207+
rootResourceName := nsToPath(ns.Name().String())
209208
initBuf.WriteString(`func init() {
210209
runtime.RegisterNSLoader(` + fmt.Sprintf("%q", rootResourceName) + `, LoadNS)
211210
}
@@ -1562,8 +1561,8 @@ var (
15621561
expectedInvalidImports = map[string]bool{
15631562
"ExceptionInfo": true,
15641563
"LinkedBlockingQueue": true,
1565-
"glojure.lang.LineNumberingPushbackReader": true,
1566-
"glojure.lang": true,
1564+
"clojure.lang.LineNumberingPushbackReader": true,
1565+
"clojure.lang": true,
15671566
"java.io.InputStreamReader": true,
15681567
"java.io.StringReader": true,
15691568
"java.util.concurrent.CountDownLatch": true,
@@ -2125,8 +2124,8 @@ var (
21252124
)
21262125

21272126
func isRuntimeOwnedVar(v *lang.Var) bool {
2128-
// namespace must be glojure.core
2129-
if v.Namespace().Name().Name() != "glojure.core" {
2127+
// namespace must be clojure.core
2128+
if v.Namespace().Name().Name() != "clojure.core" {
21302129
return false
21312130
}
21322131

@@ -2195,3 +2194,21 @@ func nodeRecurs(n *ast.Node, loopID string) bool {
21952194

21962195
return false
21972196
}
2197+
2198+
func pathToNS(path string) string {
2199+
// remove file extension if present
2200+
if ext := filepath.Ext(path); ext != "" {
2201+
path = path[:len(path)-len(ext)]
2202+
}
2203+
path = strings.ReplaceAll(path, "_", "-")
2204+
path = strings.ReplaceAll(path, "/", ".")
2205+
return path
2206+
}
2207+
2208+
func nsToPath(ns string) string {
2209+
// replace dashes with underscores
2210+
ns = strings.ReplaceAll(ns, "-", "_")
2211+
// replace dots with slashes
2212+
ns = strings.ReplaceAll(ns, ".", "/")
2213+
return ns
2214+
}

pkg/runtime/codegen_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func TestCodegen(t *testing.T) {
5252
nsName = strings.ReplaceAll(nsName, ".", "-")
5353
}
5454

55-
require := glj.Var("glojure.core", "require")
55+
require := glj.Var("clojure.core", "require")
5656
runtime.AddLoadPath(os.DirFS("testdata"))
5757
// Load the namespace
5858
require.Invoke(lang.NewSymbol(nsName))
@@ -67,11 +67,11 @@ func TestCodegen(t *testing.T) {
6767
})
6868
}
6969

70-
t.Run("glojure.core", func(t *testing.T) {
70+
t.Run("clojure.core", func(t *testing.T) {
7171
// Test the core namespace
72-
ns := lang.FindNamespace(lang.NewSymbol("glojure.core"))
72+
ns := lang.FindNamespace(lang.NewSymbol("clojure.core"))
7373
if ns == nil {
74-
t.Fatal("glojure.core namespace not found")
74+
t.Fatal("clojure.core namespace not found")
7575
}
7676

7777
if err := os.MkdirAll("testdata/codegen/test/core", 0755); err != nil {
@@ -138,7 +138,7 @@ func generateAndTestNamespace(t *testing.T, ns *lang.Namespace, goldenFile strin
138138
// run go vet on the temp file with .go extension
139139
// - two exceptions: core and try_basic generate unreachable code
140140
// TODO: fix the code generation to avoid unreachable code
141-
if ns.Name().String() == "glojure.core" || ns.Name().String() == "codegen.test.try-basic" {
141+
if ns.Name().String() == "clojure.core" || ns.Name().String() == "codegen.test.try-basic" {
142142
t.Logf("skipping go vet for %s", goldenFile)
143143
return
144144
}

pkg/runtime/envinit.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,18 +115,18 @@ func NewEnvironment(opts ...EvalOption) lang.Environment {
115115
}
116116

117117
// Add stdlib
118-
RT.Load("glojure/core")
118+
RT.Load("clojure/core")
119119

120120
// Workaround to ensure namespaces that are required by core are loaded.
121121
// TODO: AOT should identify this dependency and generate code to load it.
122122
if useAot {
123-
RT.Load("glojure/protocols")
124-
RT.Load("glojure/string")
123+
RT.Load("clojure/protocols")
124+
RT.Load("clojure/string")
125125
RT.Load("glojure/go/io")
126126
}
127127

128128
// Set the glojure version
129-
core := lang.FindNamespace(lang.NewSymbol("glojure.core"))
129+
core := lang.FindNamespace(lang.NewSymbol("clojure.core"))
130130
versionVar := core.FindInternedVar(lang.NewSymbol("*glojure-version*"))
131131
if versionVar != nil {
132132
versionVar.BindRoot(ParseVersion(VERSION))

0 commit comments

Comments
 (0)