Fix and test recursive functions with fibonacci numbers
This commit is contained in:
17
fib.gi
Normal file
17
fib.gi
Normal 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))
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user