Skip to content

Commit f8d1a7d

Browse files
authored
Merge pull request #92 from NuruProgramming/fh/add-type-casting
Fh/add type casting
2 parents 3d86a67 + 480eb06 commit f8d1a7d

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed

evaluator/builtins.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,36 @@ var builtins = map[string]*object.Builtin{
148148
},
149149
},
150150

151+
"badilisha": {
152+
Fn: func(args ...object.Object) object.Object {
153+
if len(args) != 2 {
154+
return newError("Samahani, badili inahitaji hoja 2, wewe umeweka %d", len(args))
155+
}
156+
157+
value := args[0]
158+
targetType := args[1]
159+
160+
if targetType.Type() != object.STRING_OBJ {
161+
return newError("Aina ya lengo lazima iwe neno")
162+
}
163+
164+
targetTypeStr := targetType.(*object.String).Value
165+
166+
switch targetTypeStr {
167+
case "NAMBA":
168+
return convertToInteger(value)
169+
case "DESIMALI":
170+
return convertToFloat(value)
171+
case "NENO":
172+
return convertToString(value)
173+
case "BOOLEAN":
174+
return convertToBoolean(value)
175+
default:
176+
return newError("Aina isiyojulikana: %s", targetTypeStr)
177+
}
178+
},
179+
},
180+
151181
// "jumla": {
152182
// Fn: func(args ...object.Object) object.Object {
153183
// if len(args) != 1 {

evaluator/type.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package evaluator
2+
3+
import (
4+
"strconv"
5+
6+
"github.com/NuruProgramming/Nuru/object"
7+
)
8+
9+
func convertToInteger(obj object.Object) object.Object {
10+
switch obj := obj.(type) {
11+
case *object.Integer:
12+
return obj
13+
case *object.Float:
14+
return &object.Integer{Value: int64(obj.Value)}
15+
case *object.String:
16+
i, err := strconv.ParseInt(obj.Value, 10, 64)
17+
if err != nil {
18+
return newError("Haiwezi kubadilisha '%s' kuwa NAMBA", obj.Value)
19+
}
20+
return &object.Integer{Value: i}
21+
case *object.Boolean:
22+
if obj.Value {
23+
return &object.Integer{Value: 1}
24+
}
25+
return &object.Integer{Value: 0}
26+
default:
27+
return newError("Haiwezi kubadilisha %s kuwa NAMBA", obj.Type())
28+
}
29+
}
30+
31+
func convertToFloat(obj object.Object) object.Object {
32+
switch obj := obj.(type) {
33+
case *object.Float:
34+
return obj
35+
case *object.Integer:
36+
return &object.Float{Value: float64(obj.Value)}
37+
case *object.String:
38+
f, err := strconv.ParseFloat(obj.Value, 64)
39+
if err != nil {
40+
return newError("Haiwezi kubadilisha '%s' kuwa DESIMALI", obj.Value)
41+
}
42+
return &object.Float{Value: f}
43+
case *object.Boolean:
44+
if obj.Value {
45+
return &object.Float{Value: 1.0}
46+
}
47+
return &object.Float{Value: 0.0}
48+
default:
49+
return newError("Haiwezi kubadilisha %s kuwa DESIMALI", obj.Type())
50+
}
51+
}
52+
53+
func convertToString(obj object.Object) object.Object {
54+
return &object.String{Value: obj.Inspect()}
55+
}
56+
57+
func convertToBoolean(obj object.Object) object.Object {
58+
switch obj := obj.(type) {
59+
case *object.Boolean:
60+
return obj
61+
case *object.Integer:
62+
return &object.Boolean{Value: obj.Value != 0}
63+
case *object.Float:
64+
return &object.Boolean{Value: obj.Value != 0}
65+
case *object.String:
66+
return &object.Boolean{Value: len(obj.Value) > 0}
67+
case *object.Null:
68+
return &object.Boolean{Value: false}
69+
default:
70+
return &object.Boolean{Value: true}
71+
}
72+
}

0 commit comments

Comments
 (0)