Fix and test recursive functions with fibonacci numbers

This commit is contained in:
Marc Vertes
2018-02-12 10:09:02 +01:00
parent bef44db73c
commit 1bbf5b14f9
4 changed files with 30 additions and 3 deletions

17
fib.gi Normal file
View File

@@ -0,0 +1,17 @@
//#!/usr/bin/env gi
package main
// Compute fibonacci numbers, no memoization
func fib(n int) int {
if n < 2 {
return n
}
return fib(n-2) + fib(n-1)
}
func main() {
println(fib(35))
//println(fib(10))
}

View File

@@ -73,6 +73,8 @@ func (e *Node) Cfg(i *Interpreter) int {
n.run = equal
case token.LSS:
n.run = lower
case token.SUB:
n.run = sub
}
maxIndex++
n.findex = maxIndex

View File

@@ -82,10 +82,9 @@ func (i *Interpreter) Eval(src string) interface{} {
if i.opt.Cfg {
root.CfgDot(Dotty())
}
//root.OptimCfg()
// Execute CFG
entry := root.Child[1] // FIXME: entry point should be resolved from 'main' name
//entry.OptimCfg()
Run(entry, nil, nil, nil)
Run(i.def["main"], nil, nil, nil)
return i.out
}

View File

@@ -4,6 +4,7 @@ import "fmt"
// Run a Go function
func Run(def *Node, cf *Frame, args []*Node, rets []int) {
//fmt.Println("run", def.Child[0].ident)
// Allocate a new Frame to store local variables
f := Frame(make([]interface{}, def.findex))
@@ -12,6 +13,7 @@ func Run(def *Node, cf *Frame, args []*Node, rets []int) {
for i, arg := range args {
f[param[i].findex] = value(arg, cf)
}
//fmt.Println("frame:", f)
// Execute by walking the CFG and running node func at each step
body := def.Child[2]
@@ -56,6 +58,7 @@ func printa(n []*Node, f *Frame) {
}
func (interp *Interpreter) call(n *Node, f *Frame) {
//fmt.Println("call", n.Child[0].ident)
if n.Child[0].ident == "println" {
printa(n.Child[1:], f)
return
@@ -81,6 +84,10 @@ func add(n *Node, f *Frame) {
(*f)[n.findex] = value(n.Child[0], f).(int64) + value(n.Child[1], f).(int64)
}
func sub(n *Node, f *Frame) {
(*f)[n.findex] = value(n.Child[0], f).(int64) - value(n.Child[1], f).(int64)
}
func equal(n *Node, f *Frame) {
(*f)[n.findex] = value(n.Child[0], f).(int64) == value(n.Child[1], f).(int64)
}
@@ -99,4 +106,6 @@ func _return(n *Node, f *Frame) {
for i, c := range n.Child {
(*f)[i] = (*f)[c.findex]
}
// FIXME: should be done during compiling, not run
n.tnext = nil
}