add basic support for tuples

This commit is contained in:
Neemek 2026-07-11 12:37:15 +02:00
parent 7bb277045c
commit e03d18c7db
Signed by: neemek
GPG key ID: 84FFE4D7D40AB25E
7 changed files with 339 additions and 18 deletions

View file

@ -193,6 +193,18 @@ func (c *Compiler) compile(tree Node) error {
panic("compile called with nil value")
}
if c.optimize && c.isTreeConstant(tree) {
v, err := c.compute(tree)
if err != nil {
panic(err) // this shouldn't happen
}
c.add(InstructionConstant)
c.addConstant(v)
return nil
}
switch tree.Type() {
case StringNodeType:
n := tree.(*StringNode)
@ -236,19 +248,23 @@ func (c *Compiler) compile(tree Node) error {
c.add(InstructionConstant)
c.addConstant(&IntegerValue{tree.(*IntegerNode).value})
case TupleNodeType:
n := tree.(*TupleNode)
for _, n := range n.items {
err := c.compile(n)
if err != nil {
return err
}
}
c.add(InstructionFormTuple)
c.addU16(uint16(len(n.items)))
case ListNodeType:
l := tree.(*ListNode)
if len(l.items) == 0 {
c.add(InstructionNewList)
} else if c.optimize && c.isTreeConstant(l) {
v, err := c.compute(l)
if err != nil {
panic(err) // this shouldn't happen
}
c.add(InstructionConstant)
c.addConstant(v)
} else {
for _, n := range l.items {
err := c.compile(n)
@ -1001,6 +1017,21 @@ func (c *Compiler) deduceSignature(tree Node) (TypeSignature, error) {
return c.deduceSignature(n.statements[len(n.statements)-1])
case AssignNodeType:
return c.deduceSignature(tree.(*AssignNode).value)
case TupleNodeType:
n := tree.(*TupleNode)
var items []TypeSignature
for _, i := range n.items {
t, err := c.deduceSignature(i)
if err != nil {
return nil, err
}
items = append(items, t)
}
return &TupleSignature{
items,
}, nil
default:
return nil, c.error(fmt.Sprintf("impossible to deduce signature of %s", tree.Type()), tree)
}