Skip to content

Commit 78076bb

Browse files
authored
Merge pull request #111 from Heracraft/main
First class WASM support
2 parents 0a64ef4 + d0a3b22 commit 78076bb

12 files changed

Lines changed: 370 additions & 176 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,4 @@ config.json
5959
/Nuru
6060

6161
dist/
62+
*.wasm

Makefile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@ build_android:
3434
@echo 'cleaning up...'
3535
rm nuru
3636

37+
build_wasm:
38+
@echo 'building wasm binary'
39+
GOOS=js GOARCH=wasm go build -o nuru.wasm
40+
@echo 'zipping build...'
41+
tar -zcvf nuru_wasm_v${VERSION}.tar.gz nuru.wasm
42+
@echo 'cleaning up...'
43+
rm nuru.wasm
44+
45+
3746
build_test:
3847
go build -ldflags="-s -w" -o nuru
3948

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ There are documentations for two languages, English and Kiswahili, which are bot
404404

405405
Clone the repo, hack it, make sure all tests are passing then submit a pull request.
406406

407-
> Make sure ALL tests are passing before making a pull request. You can confirm with running `make tests`
407+
> Make sure ALL tests are passing before making a pull request. You can confirm with running `make test`
408408
409409
## Community
410410

evaluator/builtins.go

Lines changed: 6 additions & 169 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
//go:build !js || !wasm
2+
13
package evaluator
24

35
import (
@@ -71,176 +73,11 @@ var builtins = map[string]*object.Builtin{
7173
}
7274
},
7375
},
74-
"aina": {
75-
Fn: func(args ...object.Object) object.Object {
76-
if len(args) != 1 {
77-
return newError("Samahani, tunahitaji hoja 1, wewe umeweka %d", len(args))
78-
}
79-
80-
return &object.String{Value: string(args[0].Type())}
81-
},
82-
},
83-
"fungua": {
84-
Fn: func(args ...object.Object) object.Object {
85-
86-
if len(args) != 1 {
87-
return newError("Samahani, tunahitaji hoja 1, wewe umeweka %d", len(args))
88-
}
89-
filename := args[0].(*object.String).Value
90-
91-
file, err := os.ReadFile(filename)
92-
if err != nil {
93-
return &object.Error{Message: "Tumeshindwa kusoma faili au faili halipo"}
94-
}
95-
return &object.File{Filename: filename, Content: string(file)}
96-
},
97-
},
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-
}
10376

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-
},
150-
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-
"namba": {
181-
Fn: func(args ...object.Object) object.Object {
182-
if len(args) != 1 {
183-
return newError("Samahani, namba inahitaji hoja 1, wewe umeweka %d", len(args))
184-
}
185-
value := args[0]
186-
return convertToInteger(value)
187-
},
188-
},
189-
"tungo": {
190-
Fn: func(args ...object.Object) object.Object {
191-
if len(args) != 1 {
192-
return newError("Samahani, tungo inahitaji hoja 1, wewe umeweka %d", len(args))
193-
}
194-
value := args[0]
195-
return convertToString(value)
196-
},
197-
},
198-
199-
// "jumla": {
200-
// Fn: func(args ...object.Object) object.Object {
201-
// if len(args) != 1 {
202-
// return newError("Hoja hazilingani, tunahitaji=1, tumepewa=%d", len(args))
203-
// }
204-
205-
// switch arg := args[0].(type) {
206-
// case *object.Array:
207-
208-
// var sums float64
209-
// for _, num := range arg.Elements {
210-
211-
// if num.Type() != object.INTEGER_OBJ && num.Type() != object.FLOAT_OBJ {
212-
// return newError("Samahani namba tu zinahitajika")
213-
// } else {
214-
// if num.Type() == object.INTEGER_OBJ {
215-
// no, _ := strconv.Atoi(num.Inspect())
216-
// floatnum := float64(no)
217-
// sums += floatnum
218-
// } else if num.Type() == object.FLOAT_OBJ {
219-
// no, _ := strconv.ParseFloat(num.Inspect(), 64)
220-
// sums += no
221-
// }
222-
223-
// }
224-
// }
225-
226-
// if math.Mod(sums, 1) == 0 {
227-
// return &object.Integer{Value: int64(sums)}
228-
// }
229-
230-
// return &object.Float{Value: float64(sums)}
231-
232-
// default:
233-
// return newError("Samahani, hii function haitumiki na %s", args[0].Type())
234-
// }
235-
// },
236-
// },
23777
}
23878

239-
func getIntValue(obj object.Object) (int64, error) {
240-
switch obj := obj.(type) {
241-
case *object.Integer:
242-
return obj.Value, nil
243-
default:
244-
return 0, fmt.Errorf("expected integer, got %T", obj)
79+
func init(){
80+
for name, builtin := range commonBuiltins{
81+
builtins[name]=builtin
24582
}
246-
}
83+
}

0 commit comments

Comments
 (0)