MCPcopy
hub / github.com/google/mangle / EvalApplyFn

Function EvalApplyFn

functional/functional.go:104–916  ·  view source on GitHub ↗

EvalApplyFn evaluates a built-in function application.

(applyFn ast.ApplyFn, subst ast.Subst)

Source from the content-addressed store, hash-verified

102
103// EvalApplyFn evaluates a built-in function application.
104func EvalApplyFn(applyFn ast.ApplyFn, subst ast.Subst) (ast.Constant, error) {
105 evaluatedArgs, err := EvalExprs(applyFn.Args, subst)
106 if err != nil {
107 return ast.Constant{}, err
108 }
109 switch applyFn.Function.Symbol {
110 case symbols.Append.Symbol:
111 if l := len(evaluatedArgs); l != 2 {
112 return ast.Constant{}, fmt.Errorf("expected 2 list arguments, got %d argument(s)", l)
113 }
114 listElems, err := evaluatedArgs[0].ListSeq()
115 if err != nil {
116 return ast.Constant{}, fmt.Errorf("expected list got %v (%v) in %v (subst %v)", evaluatedArgs[0], evaluatedArgs[0].Type, applyFn, subst)
117 }
118 elem := evaluatedArgs[1]
119 var res []ast.Constant
120 for c := range listElems {
121 res = append(res, c)
122 }
123 res = append(res, elem)
124 return ast.List(res), nil
125
126 case symbols.ListContains.Symbol: // fn:list:contains(List, Member)
127 if l := len(evaluatedArgs); l != 2 {
128 return ast.Constant{}, fmt.Errorf("expected 2 list arguments, got %d argument(s)", l)
129 }
130 listElems, err := evaluatedArgs[0].ListSeq()
131 if err != nil {
132 return ast.Constant{}, fmt.Errorf("expected list got %v (%v) in %v (subst %v)", evaluatedArgs[0], evaluatedArgs[0].Type, applyFn, subst)
133 }
134 elem := evaluatedArgs[1]
135 for c := range listElems {
136 if c.Equals(elem) {
137 return ast.TrueConstant, nil
138 }
139 }
140 return ast.FalseConstant, nil
141
142 case symbols.Cons.Symbol:
143 if l := len(evaluatedArgs); l != 2 {
144 return ast.Constant{}, fmt.Errorf("expected 2 list arguments, got %d argument(s)", l)
145 }
146 fst := evaluatedArgs[0]
147 snd := evaluatedArgs[1]
148 if snd.Type != ast.ListShape {
149 return ast.Constant{}, fmt.Errorf("second argument has to be a list, got %v", snd.Type)
150 }
151 return ast.ListCons(&fst, &snd), nil
152
153 case symbols.Pair.Symbol:
154 if l := len(evaluatedArgs); l != 2 {
155 return ast.Constant{}, fmt.Errorf("expected 2 list arguments, got %d argument(s)", l)
156 }
157 fst := evaluatedArgs[0]
158 snd := evaluatedArgs[1]
159 return ast.Pair(&fst, &snd), nil
160
161 case symbols.Len.Symbol:

Callers 15

evalLetFunction · 0.92
evalDoFunction · 0.92
TestEvalApplyFnFunction · 0.85
TestEvalApplyFnNegativeFunction · 0.85
TestNameFunsFunction · 0.85
TestTimeNowFunction · 0.85
TestTimeAddFunction · 0.85
TestTimeSubFunction · 0.85
TestTimeFormatFunction · 0.85
TestTimeFormatCivilFunction · 0.85
TestTimeFormatInvalidFunction · 0.85

Calls 15

ListFunction · 0.92
ListConsFunction · 0.92
PairFunction · 0.92
NumberFunction · 0.92
MapFunction · 0.92
StructFunction · 0.92
StringFunction · 0.92
FormatNumberFunction · 0.92
NameFunction · 0.92
TimeFunction · 0.92
DurationFunction · 0.92
Float64Function · 0.92

Tested by 15

TestEvalApplyFnFunction · 0.68
TestEvalApplyFnNegativeFunction · 0.68
TestNameFunsFunction · 0.68
TestTimeNowFunction · 0.68
TestTimeAddFunction · 0.68
TestTimeSubFunction · 0.68
TestTimeFormatFunction · 0.68
TestTimeFormatCivilFunction · 0.68
TestTimeFormatInvalidFunction · 0.68
TestTimeParseFunction · 0.68
TestTimeParseCivilFunction · 0.68