v icon indicating copy to clipboard operation
v copied to clipboard

bug: closure mapping

Open kendfss opened this issue 2 years ago • 1 comments

Describe the bug

array mappings with a single argument that is a closure are not correctly transpiled.

Expected Behavior

v run closure_mapping.v
hello, world

Current Behavior

v run closure_mapping.v
==================
/tmp/v_1000/closure_mapping.14895787168227109320.tmp.c:13506: error: '{' expected (got ";")
...
==================
(Use `v -cg` to print the entire error message)

builder error:
==================
C error. This should never happen.

This is a compiler bug, please report it using `v bug file.v`.

https://github.com/vlang/v/issues/new/choose

You can also use #help on Discord: https://discord.gg/vlang

Reproduction Steps

// closure_mapping.v
import gx

fn main() {
  println('hello, world')
}

struct Theme {
	bg_color        gx.Color
	padding_color   gx.Color
	text_color      gx.Color
	game_over_color gx.Color
	victory_color   gx.Color
	tile_colors     []gx.Color
}

fn whitener(d u8) fn (gx.Color) gx.Color {
	return fn [d] (c gx.Color) gx.Color {
		return gx.Color{
			r: c.r + d
			g: c.g + d
			b: c.b + d
			a: c.a
		}
	}
}

const (
	themes                = [
		&Theme{
			bg_color: gx.rgb(55, 55, 55)
			padding_color: gx.rgb(68, 60, 59)
			victory_color: gx.rgb(100, 160, 100)
			game_over_color: gx.rgb(190, 50, 50)
			text_color: gx.white
			tile_colors: ([
				gx.rgb(123, 115, 108),
				gx.rgb(142, 136, 130),
				gx.rgb(142, 134, 120),
				gx.rgb(145, 106, 72),
				gx.rgb(147, 89, 59),
				gx.rgb(147, 74, 57),
				gx.rgb(147, 56, 35),
				gx.rgb(142, 124, 68),
				gx.rgb(142, 122, 58),
				gx.rgb(142, 120, 48),
				gx.rgb(142, 118, 37),
				gx.rgb(142, 116, 27),
			]).map(whitener(10))
		},
	]
)

v run closure_mapping.v

Possible Solution

Well the reason is the handling of closure mappings. I don't know enough about C to understand why { is expected where ; is found but the line array_push_noscan((array*)&_t1, &ti); should be something like array_push_noscan((array*)&_t1, &(ti(it)));

Additional Information/Context

I was tinkering with v/examples/2048/2048.v

V version

V 0.3.3 d7a418f

Environment details (OS name and version, etc.)

OS: linux, Linux Mint 20.3 Processor: 4 cpus, 64bit, little endian, Intel(R) Core(TM) i5-5350U CPU @ 1.80GHz CC version: cc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0

getwd: /home/kendfss/gitclone/clones/kendfss/vbugs vmodules: /home/kendfss/.vmodules vroot: /home/kendfss/gitclone/clones/vlang/v vexe: /home/kendfss/gitclone/clones/vlang/v/v vexe mtime: 2023-03-06 18:58:06 is vroot writable: true is vmodules writable: true V full version: V 0.3.3 d7a418f

Git version: git version 2.25.1 Git vroot status: weekly.2023.10-dirty .git/config present: true thirdparty/tcc status: thirdparty-linux-amd64 12f392c3

kendfss avatar Mar 06 '23 19:03 kendfss

Apparently this is an advancement from https://github.com/vlang/v/issues/12906

Given that, perhaps more for my use case than the above or https://github.com/vlang/v/issues/14416, this can be circumvented by changing map(whitener(10)) to map(whitener(10)(it)) it may be worth adding a type/syntax error. That would mean that array.map(my_func) would be invalidated in favour of array.map(my_func(it)). Due to backward compatibility violation this should probably be handled by v fmt.

Tagging @medvednikov for a decision. Happy to learn what's necessary to make the changes.

kendfss avatar Mar 06 '23 19:03 kendfss