-
Notifications
You must be signed in to change notification settings - Fork 0
/
expr.go
67 lines (54 loc) · 1.08 KB
/
expr.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package tcl
import (
// "bytes"
// . "fmt"
"runtime"
// "strconv"
"strings"
)
var _ = runtime.Breakpoint
var Zero = MkInt(0)
var One = MkInt(1)
var False = Zero
var True = One
// Concatenate the arguments, adding a space separator, before evaluating the
// expression.
func cmdExpr(fr *Frame, argv []T) T {
// Optimization: It's already a single arg.
if len(argv) == 2 {
return fr.EvalExpr(argv[1])
}
strs := make([]string, len(argv)-1)
for i, t := range argv[1:] {
strs[i] = t.String()
}
ex := strings.Join(strs, " ")
return fr.EvalExpr(MkString(ex))
}
// Takes a single word that represents an expression and returns the result.
func (fr *Frame) EvalExpr(a T) (result T) {
return a.EvalExpr(fr)
/*
// Optimization: It's already a number.
if a.IsQuickNumber() {
return a
}
s := a.String()
// Optimization: "0" and "1"
if len(s) == 1 {
if s == "0" {
return False
}
if s == "1" {
return True
}
}
return fr.ParseExpression(s)
*/
}
func init() {
if Safes == nil {
Safes = make(map[string]Command, 333)
}
Safes["expr"] = cmdExpr
}