[Omake] Map.foreach clobbers the scope?

Christopher L Conway cconway at cs.nyu.edu
Thu May 29 09:45:49 PDT 2008


When I use Map.foreach in a static block, variables defined in the
block don't get exported. I.e.,

    static. =
        A = bar
        M.foreach(x,val)
            ....
        export
    # A is not visible here

Just commenting out the foreach block makes A reappear (see below).
Oddly, if A is defined before the static block, the previous
definition of A will appear after the foreach block. I.e.,

    A = foo
    static. =
        A = bar
        M.foreach(x,val)
            ....
        # A == foo
        export
    # A == foo

Putting the foreach inside a section block fixes the problem... It
seems like somehow M.foreach pops an extra export scope on exit?

Regards,
Chris

$ omake --version
OMake 0.9.8.5 (release 2):
	build [Wed Aug 8 09:10:36 2007]
	on wagstaff

Default library directory : /home/chris/tools/lib/omake
$ cat OMakefile
M. =
    extends $(Map)
    $|X| = 123
    $|Y| = 456
    $|Z| = 789


static. =
    A = bar
    println($"1. A=$(A)")
    M.foreach(x,val)
        println($"$(x)=$(val)")
    println($"2. A=$(A)")
    export

println($"3. A=$(A)")
chris at wagstaff:~/src/tests/omake/map$ omake --configure
make[0]: Entering directory `/home/chris/src/tests/omake/map'
*** omake: reading OMakefiles
1. A=bar
X=123
Y=456
Z=789
2. A=bar
*** omake error:
   File OMakefile: line 16, characters 16-20
   unbound variable: public.A

If I just comment out M.foreach call, A is visible outside the block.


chris at wagstaff:~/src/tests/omake/map$ cat OMakefile
M. =
    extends $(Map)
    $|X| = 123
    $|Y| = 456
    $|Z| = 789


static. =
    A = bar
    println($"1. A=$(A)")
#     M.foreach(x,val)
#         println($"$(x)=$(val)")
    println($"2. A=$(A)")
    export

println($"3. A=$(A)")
chris at wagstaff:~/src/tests/omake/map$ omake --configure
make[0]: Entering directory `/home/chris/src/tests/omake/map'
*** omake: reading OMakefiles
1. A=bar
2. A=bar
3. A=bar
*** omake: finished reading OMakefiles (0.02 sec)
*** omake: done (0.03 sec, 0/0 scans, 0/0 rules, 1/33 digests)
chris at wagstaff:~/src/tests/omake/map$ cat OMakefile
M. =
    extends $(Map)
    $|X| = 123
    $|Y| = 456
    $|Z| = 789

A = foo
println($"0. A=$(A)")

static. =
    A = bar
    println($"1. A=$(A)")
    M.foreach(x,val)
        println($"$(x)=$(val)")
    println($"2. A=$(A)")
    export

println($"3. A=$(A)")
chris at wagstaff:~/src/tests/omake/map$ omake --configure
make[0]: Entering directory `/home/chris/src/tests/omake/map'
*** omake: reading OMakefiles
0. A=foo
1. A=bar
X=123
Y=456
Z=789
2. A=foo
3. A=foo
*** omake: finished reading OMakefiles (0.01 sec)
*** omake: done (0.02 sec, 0/0 scans, 0/0 rules, 1/33 digests)
$ cat OMakefile
M. =
    extends $(Map)
    $|X| = 123
    $|Y| = 456
    $|Z| = 789

static. =
    A = bar
    println($"1. A=$(A)")
    section
      M.foreach(x,val)
        println($"$(x)=$(val)")
    println($"2. A=$(A)")
    export

println($"3. A=$(A)")
chris at wagstaff:~/src/tests/omake/map$ omake
make[0]: Entering directory `/home/chris/src/tests/omake/map'
*** omake: reading OMakefiles
1. A=bar
X=123
Y=456
Z=789
2. A=bar
3. A=bar
*** omake: finished reading OMakefiles (0.02 sec)
*** omake: done (0.02 sec, 0/0 scans, 0/0 rules, 1/33 digests)


More information about the Omake mailing list