mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
149 lines
2.4 KiB
V
149 lines
2.4 KiB
V
// helper
|
|
fn sqr(x int) int {
|
|
return x * x
|
|
}
|
|
|
|
fn high_fn(f fn (int) int) {
|
|
x := f(111)
|
|
println('x == $x')
|
|
}
|
|
|
|
fn high_fn_no_ret(f fn (int)) {
|
|
f(111)
|
|
}
|
|
|
|
fn high_fn_array(f fn (a []int) []int) {
|
|
}
|
|
|
|
fn high_fn_multi_return(a int, b fn (c []int, d []string) ([]int, []string)) {
|
|
}
|
|
|
|
fn high_fn_return_single_anon() fn (int) f32 {
|
|
_ = 1
|
|
correct := fn (n int) f32 {
|
|
return f32(n * n)
|
|
}
|
|
return correct
|
|
}
|
|
|
|
fn high_fn_return_multi_anons() (fn (int) f32, fn (int) string) {
|
|
// parsing trap
|
|
_ = fn (n int) byte {
|
|
return 0x00
|
|
}
|
|
correct_second := fn (n int) string {
|
|
return '$n'
|
|
}
|
|
correct_first := fn (n int) f32 {
|
|
return f32(n * n)
|
|
}
|
|
// parsing trap
|
|
_ = fn (n int) []int {
|
|
return [n]
|
|
}
|
|
return correct_first, correct_second
|
|
}
|
|
|
|
fn high_fn_return_named_fn() fn (int) int {
|
|
return sqr
|
|
}
|
|
|
|
fn test_high_fn_ret_anons() {
|
|
param := 13
|
|
func_sqr1 := high_fn_return_single_anon()
|
|
assert func_sqr1(param) == param * param
|
|
|
|
func_sqr2, func_repr := high_fn_return_multi_anons()
|
|
assert func_sqr2(param) == (param * param)
|
|
assert func_repr(param) == '$param'
|
|
|
|
top_lvl_sqr := high_fn_return_named_fn()
|
|
assert top_lvl_sqr(param) == param * param
|
|
}
|
|
|
|
fn high_fn_applier(arg int, func fn (a int) string) string {
|
|
return func(arg)
|
|
}
|
|
|
|
fn test_high_fn_applier() {
|
|
arg := 13
|
|
expect := '$arg $arg'
|
|
func := fn (arg int) string {
|
|
return '$arg $arg'
|
|
}
|
|
assert expect == high_fn_applier(arg, func)
|
|
}
|
|
|
|
fn test_fns() {
|
|
// no asserts for now, just test function declarations above
|
|
high_fn(sqr)
|
|
}
|
|
|
|
fn test_anon_fn() {
|
|
f1 := fn (a int) {
|
|
println('hello from f1')
|
|
}
|
|
f1(1)
|
|
|
|
f2 := fn (a int) int {
|
|
println('hello from f2')
|
|
return 10
|
|
}
|
|
f2res := f2(1)
|
|
println('f2res == $f2res')
|
|
// TODO/FIXME: assert bug? uncomment to see
|
|
// assert f2res == 10
|
|
|
|
high_fn(fn (x int) int {
|
|
return x + 1
|
|
})
|
|
|
|
high_fn_no_ret(fn (x int) {
|
|
println('hello $x')
|
|
})
|
|
}
|
|
|
|
fn test_anon_fn_direct_call() {
|
|
fn (name string) {
|
|
println('hello $name')
|
|
}('from anon')
|
|
|
|
b := fn (n int) int {
|
|
return 11 + n
|
|
}(100)
|
|
assert b == 111
|
|
}
|
|
|
|
//
|
|
// Test assigning functions (IdentFn)
|
|
//
|
|
|
|
fn simple_fn1() int {
|
|
return 1
|
|
}
|
|
|
|
fn simple_fn2(n f32) (int, string) {
|
|
return int(1 + n), 'fish'
|
|
}
|
|
|
|
fn test_assigning_fns() {
|
|
func1 := simple_fn1
|
|
assert func1() == 1
|
|
|
|
func2 := simple_fn2
|
|
res2_1, res2_2 := func2(13.0)
|
|
assert res2_1 == 14.0
|
|
assert res2_2 == 'fish'
|
|
|
|
anon_func1 := fn (s string) int {
|
|
return s.len
|
|
}
|
|
func3 := anon_func1
|
|
res3 := func3('fish')
|
|
assert res3 == 4
|
|
}
|
|
|
|
//
|
|
// End assigning functions (IdentFn)
|
|
//
|