diff --git a/doc/docs.md b/doc/docs.md index b3cf8735e4..15206d20ba 100644 --- a/doc/docs.md +++ b/doc/docs.md @@ -1700,14 +1700,15 @@ fn main() { res := run(5, fn (n int) int { return n + n }) + println(res) // "10" // You can even have an array/map of functions: fns := [sqr, cube] - println((10)) // "100" + println(fns[0](10)) // "100" fns_map := map{ 'sqr': sqr 'cube': cube } - println((2)) // "8" + println(fns_map['cube'](2)) // "8" } ``` diff --git a/vlib/v/ast/str.v b/vlib/v/ast/str.v index 6598339b4e..77029ae01e 100644 --- a/vlib/v/ast/str.v +++ b/vlib/v/ast/str.v @@ -241,6 +241,9 @@ pub fn (x Expr) str() string { if x.name.starts_with('${x.mod}.') { return util.strip_main_name('${x.name}($sargs)') } + if x.mod == '' && x.name == '' { + return x.left.str() + '($sargs)' + } return '${x.mod}.${x.name}($sargs)' } CharLiteral { @@ -273,6 +276,14 @@ pub fn (x Expr) str() string { InfixExpr { return '$x.left.str() $x.op.str() $x.right.str()' } + MapInit { + mut pairs := []string{} + for ik, kv in x.keys { + mv := x.vals[ik].str() + pairs << '$kv: $mv' + } + return 'map{ ${pairs.join(' ')} }' + } ParExpr { return '($x.expr)' } @@ -321,7 +332,7 @@ pub fn (x Expr) str() string { return res.join('') } StringLiteral { - return '"$x.val"' + return "'$x.val'" } Type { return 'Type($x.typ)' diff --git a/vlib/v/checker/tests/prefix_err.out b/vlib/v/checker/tests/prefix_err.out index 58f32cc9b2..528ddd0126 100644 --- a/vlib/v/checker/tests/prefix_err.out +++ b/vlib/v/checker/tests/prefix_err.out @@ -33,7 +33,7 @@ vlib/v/checker/tests/prefix_err.vv:9:6: error: cannot take the address of 10 | ^ 10 | _ := &"Hi" 11 | _ := &"${b}" -vlib/v/checker/tests/prefix_err.vv:10:6: error: cannot take the address of "Hi" +vlib/v/checker/tests/prefix_err.vv:10:6: error: cannot take the address of 'Hi' 8 | _ := &(get() + 1) 9 | _ := &10 10 | _ := &"Hi" diff --git a/vlib/v/fmt/fmt.v b/vlib/v/fmt/fmt.v index a21ed03dcf..522e41cd9c 100644 --- a/vlib/v/fmt/fmt.v +++ b/vlib/v/fmt/fmt.v @@ -1808,6 +1808,9 @@ pub fn (mut f Fmt) call_expr(node ast.CallExpr) { f.write('$name') } } + if node.mod == '' && node.name == '' { + f.write(node.left.str()) + } f.write_generic_if_require(node) f.write('(') f.call_args(node.args) diff --git a/vlib/v/fmt/tests/maps_of_fns_with_string_keys_keep.vv b/vlib/v/fmt/tests/maps_of_fns_with_string_keys_keep.vv new file mode 100644 index 0000000000..bcb6affb0d --- /dev/null +++ b/vlib/v/fmt/tests/maps_of_fns_with_string_keys_keep.vv @@ -0,0 +1,13 @@ +fn sqr(n int) int { + return n * n +} + +fn main() { + fns := [sqr] + println(fns[0](10)) + fns_map := map{ + 'sqr': sqr + } + println(fns_map['sqr']) + println(fns_map['sqr'](2)) +}