func makeLetFun(node *parser.CallNode) ast.Expr { bindings := makeBindings(node.Args[0].(*parser.VectorNode), token.DEFINE) body := append(bindings, wrapExprsWithStmt(EvalExprs(node.Args[1:]))...) body[len(body)-1] = makeReturnStmt(h.E(body[len(body)-1].(*ast.ExprStmt).X)) fieldList := makeFieldList([]*ast.Field{makeField(nil, anyType)}) typ := makeFuncType(fieldList, nil) fn := makeFuncLit(typ, makeBlockStmt(body)) return makeFuncCall(fn, h.EmptyE()) }
func makeIfStmtFunc(node *parser.CallNode) ast.Expr { var elseBody ast.Stmt if len(node.Args) > 2 { elseBody = makeBlockStmt(h.S(makeReturnStmt(h.E(EvalExpr(node.Args[2]))))) } else { elseBody = makeBlockStmt(h.S(makeReturnStmt(h.E(ast.NewIdent("nil"))))) } cond := EvalExpr(node.Args[0]) ifBody := makeBlockStmt(h.S(makeReturnStmt(h.E(EvalExpr(node.Args[1]))))) ifStmt := makeIfStmt(cond, ifBody, elseBody) fnBody := makeBlockStmt(h.S(ifStmt)) returnList := makeFieldList([]*ast.Field{makeField(nil, anyType)}) fnType := makeFuncType(returnList, nil) fn := makeFuncLit(fnType, fnBody) return makeFuncCall(fn, h.EmptyE()) }