Skip to content

Commit de38a57

Browse files
committed
add range builtin
1 parent 1e2f5dd commit de38a57

File tree

3 files changed

+171
-0
lines changed

3 files changed

+171
-0
lines changed

evaluator/builtins.go

+61
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,58 @@ var builtins = map[string]*object.Builtin{
9595
return &object.File{Filename: filename, Content: string(file)}
9696
},
9797
},
98+
"mfululizo": {
99+
Fn: func(args ...object.Object) object.Object {
100+
if len(args) < 1 || len(args) > 3 {
101+
return newError("Samahani, mfululizo inahitaji hoja 1 hadi 3, wewe umeweka %d", len(args))
102+
}
103+
104+
var start, end, step int64
105+
var err error
106+
107+
switch len(args) {
108+
case 1:
109+
end, err = getIntValue(args[0])
110+
if err != nil {
111+
return newError("Hoja lazima iwe nambari nzima")
112+
}
113+
start, step = 0, 1
114+
case 2:
115+
start, err = getIntValue(args[0])
116+
if err != nil {
117+
return newError("Hoja ya kwanza lazima iwe nambari nzima")
118+
}
119+
end, err = getIntValue(args[1])
120+
if err != nil {
121+
return newError("Hoja ya pili lazima iwe nambari nzima")
122+
}
123+
step = 1
124+
case 3:
125+
start, err = getIntValue(args[0])
126+
if err != nil {
127+
return newError("Hoja ya kwanza lazima iwe nambari nzima")
128+
}
129+
end, err = getIntValue(args[1])
130+
if err != nil {
131+
return newError("Hoja ya pili lazima iwe nambari nzima")
132+
}
133+
step, err = getIntValue(args[2])
134+
if err != nil {
135+
return newError("Hoja ya tatu lazima iwe nambari nzima")
136+
}
137+
if step == 0 {
138+
return newError("Hatua haiwezi kuwa sifuri")
139+
}
140+
}
141+
142+
elements := []object.Object{}
143+
for i := start; (step > 0 && i < end) || (step < 0 && i > end); i += step {
144+
elements = append(elements, &object.Integer{Value: i})
145+
}
146+
147+
return &object.Array{Elements: elements}
148+
},
149+
},
98150

99151
// "jumla": {
100152
// Fn: func(args ...object.Object) object.Object {
@@ -135,3 +187,12 @@ var builtins = map[string]*object.Builtin{
135187
// },
136188
// },
137189
}
190+
191+
func getIntValue(obj object.Object) (int64, error) {
192+
switch obj := obj.(type) {
193+
case *object.Integer:
194+
return obj.Value, nil
195+
default:
196+
return 0, fmt.Errorf("expected integer, got %T", obj)
197+
}
198+
}

repl/docs/en/range.md

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
## Range Function (mfululizo)
2+
3+
The `mfululizo` function generates a sequence of numbers. It can be used in loops or to create arrays of sequential numbers.
4+
5+
### Syntax
6+
7+
```go
8+
mfululizo(end)
9+
mfululizo(start, end)
10+
mfululizo(start, end, step)
11+
```
12+
13+
### Parameters
14+
15+
- `end`: The upper limit of the sequence (exclusive).
16+
- `start` (optional): The starting value of the sequence. Default is 0.
17+
- `step` (optional): The increment between each number in the sequence. Default is 1.
18+
19+
### Return Value
20+
21+
Returns an array of integers.
22+
23+
### Examples
24+
25+
```go
26+
// Generate numbers from 0 to 4
27+
kwa i katika mfululizo(5) {
28+
andika(i)
29+
}
30+
// Output: 0 1 2 3 4
31+
32+
// Generate numbers from 1 to 9
33+
kwa i katika mfululizo(1, 10) {
34+
andika(i)
35+
}
36+
// Output: 1 2 3 4 5 6 7 8 9
37+
38+
// Generate even numbers from 0 to 8
39+
kwa i katika mfululizo(0, 10, 2) {
40+
andika(i)
41+
}
42+
// Output: 0 2 4 6 8
43+
44+
// Generate numbers in reverse order
45+
kwa i katika mfululizo(10, 0, -1) {
46+
andika(i)
47+
}
48+
// Output: 10 9 8 7 6 5 4 3 2 1
49+
```
50+
51+
### Notes
52+
53+
- The `end` value is exclusive, meaning the sequence will stop before reaching this value.
54+
- If a negative `step` is provided, `start` should be greater than `end`.
55+
- The `step` value cannot be zero.

repl/docs/sw/range.md

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
## Kitendakazi cha Mfululizo
2+
3+
Kitendakazi cha `mfululizo` hutoa mfululizo wa nambari, sawa na kitendakazi cha `range()` cha Python. Kinaweza kutumika katika vitanzi au kuunda safu za nambari zinazofuatana.
4+
5+
### Muundo
6+
7+
```go
8+
mfululizo(mwisho)
9+
mfululizo(mwanzo, mwisho)
10+
mfululizo(mwanzo, mwisho, hatua)
11+
```
12+
13+
### Vipengele
14+
15+
- `mwisho`: Kikomo cha juu cha mfululizo (haijumuishwi).
16+
- `mwanzo` (si lazima): Thamani ya kuanzia ya mfululizo. Chaguo-msingi ni 0.
17+
- `hatua` (si lazima): Ongezeko kati ya kila nambari katika mfululizo. Chaguo-msingi ni 1.
18+
19+
### Thamani Inayorudishwa
20+
21+
Hurudisha safu ya nambari kamili.
22+
23+
### Mifano
24+
25+
```go
26+
// Toa nambari kutoka 0 hadi 4
27+
kwa i katika mfululizo(5) {
28+
andika(i)
29+
}
30+
// Tokeo: 0 1 2 3 4
31+
32+
// Toa nambari kutoka 1 hadi 9
33+
kwa i katika mfululizo(1, 10) {
34+
andika(i)
35+
}
36+
// Tokeo: 1 2 3 4 5 6 7 8 9
37+
38+
// Toa nambari shufwa kutoka 0 hadi 8
39+
kwa i katika mfululizo(0, 10, 2) {
40+
andika(i)
41+
}
42+
// Tokeo: 0 2 4 6 8
43+
44+
// Toa nambari kwa mpangilio wa kurudi nyuma
45+
kwa i katika mfululizo(10, 0, -1) {
46+
andika(i)
47+
}
48+
// Tokeo: 10 9 8 7 6 5 4 3 2 1
49+
```
50+
51+
### Vidokezo
52+
53+
- Thamani ya `mwisho` haijumuishwi, ikimaanisha mfululizo utasimama kabla ya kufikia thamani hii.
54+
- Ikiwa `hatua` hasi imetolewa, `mwanzo` inapaswa kuwa kubwa kuliko `mwisho`.
55+
- Thamani ya `hatua` haiwezi kuwa sifuri.

0 commit comments

Comments
 (0)