Skip to content

Commit dc2ddcb

Browse files
committed
Add codegen for quote; fix var meta
Signed-off-by: James Hamlin <jfhamlin@gmail.com>
1 parent 9e97862 commit dc2ddcb

File tree

13 files changed

+64
-28
lines changed

13 files changed

+64
-28
lines changed

pkg/codegen/codegen.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func (g *Generator) Generate(ns *lang.Namespace) error {
5959

6060
g.writef("func init() {\n")
6161

62-
g.writef(" ns := lang.FindOrCreateNamespace(lang.NewSymbol(\"%s\"))\n", ns.Name().String())
62+
g.writef(" ns := lang.FindOrCreateNamespace(lang.NewSymbol(%#v))\n", ns.Name().String())
6363
g.writef(" _ = ns\n")
6464

6565
// 1. Iterate through ns.Mappings()
@@ -117,9 +117,9 @@ func (g *Generator) generateVar(nsVariableName string, name *lang.Symbol, vr *la
117117
g.writef("{\n")
118118
defer g.writef("}\n")
119119

120-
meta := name.Meta()
120+
meta := vr.Meta()
121121
varSym := g.allocateTempVar()
122-
if meta == nil {
122+
if lang.IsNil(meta) {
123123
g.writef("%s := lang.NewSymbol(\"%s\")\n", varSym, name.String())
124124
} else {
125125
metaVariable := g.generateValue(meta)
@@ -147,15 +147,17 @@ func (g *Generator) generateVar(nsVariableName string, name *lang.Symbol, vr *la
147147
// returns the variable name or constant expression for the value
148148
func (g *Generator) generateValue(value any) string {
149149
switch v := value.(type) {
150+
case *lang.Namespace:
151+
// Generate code to find or create the namespace
152+
return fmt.Sprintf("lang.FindOrCreateNamespace(lang.NewSymbol(%#v))", v.Name().String())
150153
case *runtime.Fn:
151154
return g.generateFn(v)
152155
case *lang.Map:
153156
return g.generateMapValue(v)
154157
case *lang.Vector:
155158
return g.generateVectorValue(v)
156159
case *lang.SubVector:
157-
// XXX TODO: handle sub-vectors
158-
return fmt.Sprintf("%#v", "subvector not implemented yet")
160+
return g.generateVectorValue(v)
159161
case lang.Keyword:
160162
if ns := v.Namespace(); ns != "" {
161163
return fmt.Sprintf("lang.NewKeyword(\"%s/%s\")", ns, v.Name())
@@ -208,7 +210,7 @@ func (g *Generator) generateMapValue(m *lang.Map) string {
208210
}
209211

210212
// Remove trailing comma and space
211-
if buf.Len() > 0 {
213+
if m.Count() > 0 {
212214
buf.Truncate(buf.Len() - 2)
213215
}
214216

@@ -217,7 +219,7 @@ func (g *Generator) generateMapValue(m *lang.Map) string {
217219
}
218220

219221
// generateVectorValue generates Go code for a Clojure vector
220-
func (g *Generator) generateVectorValue(v *lang.Vector) string {
222+
func (g *Generator) generateVectorValue(v lang.IPersistentVector) string {
221223
var buf bytes.Buffer
222224
buf.WriteString("lang.NewVector(")
223225

@@ -350,7 +352,6 @@ func (g *Generator) generateASTNode(node *ast.Node) string {
350352
// OpMap
351353
// OpSet
352354
// OpLetFn
353-
// OpQuote
354355
// OpGo
355356
// OpHostCall
356357
// OpHostInterop
@@ -393,6 +394,8 @@ func (g *Generator) generateASTNode(node *ast.Node) string {
393394
return g.generateWithMeta(node)
394395
case ast.OpMaybeClass:
395396
return g.generateMaybeClass(node)
397+
case ast.OpQuote:
398+
return g.generateValue(node.Sub.(*ast.QuoteNode).Expr.Sub.(*ast.ConstNode).Value)
396399
default:
397400
fmt.Printf("Generating code for AST node: %T %+v\n", node.Sub, node.Sub)
398401
panic(fmt.Sprintf("unsupported AST node type %T", node.Sub))

pkg/codegen/testdata/codegen/test/const_keyword.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/codegen/testdata/codegen/test/const_number.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/codegen/testdata/codegen/test/const_string.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/codegen/testdata/codegen/test/def_simple.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/codegen/testdata/codegen/test/loop_simple.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/codegen/testdata/codegen/test/maybe_class.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
(ns codegen.test.quote-simple)
2+
3+
(defn ^{:expected-output (list 1 2 3)} -main []
4+
'(1 2 3))

pkg/codegen/testdata/codegen/test/quote_simple.go

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/codegen/testdata/codegen/test/throw_simple.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)