# PicoLisp program that uses dynamic scoping to mirror the C example
# initialize globals
(setq a 0 b 0 c 0 d 0)
# g1 takes two parameters (these are named differently here to make
# the dynamic/global 'a' and 'd' bindings visible inside the body)
(de g1 (bb cc)
(prinl a bb cc d))
# g2 forwards its arguments to g1
(de g2 (aa cc)
(g1 aa cc))
# g3: local b = 3, call g1, then create a new block that binds c and d,
# call g2, then call g1 again and return b
(de g3 (cc aa)
(let (b 3)
(g1 aa b)
(let (c 8 d 4)
(g2 aa b))
(g1 aa b)
b))
# main: local a=4, b=5; a = g3(b,c); g3(b,a)
(de main ()
(let (a 4 b 5)
(setq a (g3 b c))
(g3 b a)))
# run main
(main)
IyBQaWNvTGlzcCBwcm9ncmFtIHRoYXQgdXNlcyBkeW5hbWljIHNjb3BpbmcgdG8gbWlycm9yIHRoZSBDIGV4YW1wbGUKCiMgaW5pdGlhbGl6ZSBnbG9iYWxzCihzZXRxIGEgMCBiIDAgYyAwIGQgMCkKCiMgZzEgdGFrZXMgdHdvIHBhcmFtZXRlcnMgKHRoZXNlIGFyZSBuYW1lZCBkaWZmZXJlbnRseSBoZXJlIHRvIG1ha2UKIyB0aGUgZHluYW1pYy9nbG9iYWwgJ2EnIGFuZCAnZCcgYmluZGluZ3MgdmlzaWJsZSBpbnNpZGUgdGhlIGJvZHkpCihkZSBnMSAoYmIgY2MpCiAgIChwcmlubCBhIGJiIGNjIGQpKQoKIyBnMiBmb3J3YXJkcyBpdHMgYXJndW1lbnRzIHRvIGcxCihkZSBnMiAoYWEgY2MpCiAgIChnMSBhYSBjYykpCgojIGczOiBsb2NhbCBiID0gMywgY2FsbCBnMSwgdGhlbiBjcmVhdGUgYSBuZXcgYmxvY2sgdGhhdCBiaW5kcyBjIGFuZCBkLAojIGNhbGwgZzIsIHRoZW4gY2FsbCBnMSBhZ2FpbiBhbmQgcmV0dXJuIGIKKGRlIGczIChjYyBhYSkKICAgKGxldCAoYiAzKQogICAgICAoZzEgYWEgYikKICAgICAgKGxldCAoYyA4IGQgNCkKICAgICAgICAgKGcyIGFhIGIpKQogICAgICAoZzEgYWEgYikKICAgICAgYikpCgojIG1haW46IGxvY2FsIGE9NCwgYj01OyBhID0gZzMoYixjKTsgZzMoYixhKQooZGUgbWFpbiAoKQogICAobGV0IChhIDQgYiA1KQogICAgICAoc2V0cSBhIChnMyBiIGMpKQogICAgICAoZzMgYiBhKSkpCgojIHJ1biBtYWluCihtYWluKQo=