diff --git a/stdlib/stdlib.go b/stdlib/stdlib.go index 6c71e90..c09520f 100644 --- a/stdlib/stdlib.go +++ b/stdlib/stdlib.go @@ -129,6 +129,20 @@ func GenFuncTable() ast.FuncTable { TimesCalled: 0, Args: 1, }, + + "concat": &ast.Function{ + Function: concat, + Name:"concatenate", + TimesCalled: 0, + Args: -1, + }, + + "print": &ast.Function{ + Function:print_str, + Name: "print", + TimesCalled: 0, + Args: 1, + }, } return stdlib diff --git a/stdlib/string.go b/stdlib/string.go new file mode 100644 index 0000000..d6f7bc9 --- /dev/null +++ b/stdlib/string.go @@ -0,0 +1,48 @@ +/* SHS: Syntactically Homogeneous Shell + * Copyright (C) 2019 Aidan Hahn + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package stdlib + +import ( + "fmt" + "gitlab.com/whom/shs/ast" + "gitlab.com/whom/shs/log" +) + +func concat(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { + in = in.Eval(ft, vt) + + var res string + for i := in; i != nil; i = i.Next { + if i.Tag == ast.LIST { + log.Log(log.ERR, "Not concatenating list", "conc") + log.Log(log.DEBUG, "Try using the expand operator (...)", "conc") + continue + } + + res += i.Value() + } + + t := &ast.Token{Tag: ast.STRING} + t.Set(res) + return t +} + +func print_str(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { + fmt.Println(in.Eval(ft, vt)) + return nil +}