#!/usr/bin/env bash
# dynamic_scope_demo.sh
# Mirrors the C-like program from the hand-out under dynamic scoping.
############################
# global variables (start all at 0)
############################
a=0
b=0
c=0
d=0
############################
# g1, g2, g3
############################
g1 () { # signature: g1(int b ; int c)
printf '%d %d %d %d\n' "$a" "$b" "$c" "${d:-0}" }
g2 () { # signature: g2(int a ; int c)
g1 "$a" "$c"
}
g3 () { # signature: g3(int c ; int a)
g1 "$a" "$b" # first print-line
# -------- inner block --------
local c
=8 # shadows the parameter c g2 "$a" "$b" # second print-line
unset d # end of inner block – restore older ‘d’
# -------- end block ---------
g1 "$a" "$b" # third print-line
echo "$b" # “return” value
}
############################
# main
############################
main () {
a=$(g3 "$b" "$c") # c is still the global 0
g3 "$b" "$a"
}
main
IyEvdXNyL2Jpbi9lbnYgYmFzaAojIGR5bmFtaWNfc2NvcGVfZGVtby5zaAojIE1pcnJvcnMgdGhlIEMtbGlrZSBwcm9ncmFtIGZyb20gdGhlIGhhbmQtb3V0IHVuZGVyIGR5bmFtaWMgc2NvcGluZy4KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBnbG9iYWwgdmFyaWFibGVzIChzdGFydCBhbGwgYXQgMCkKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwphPTAKYj0wCmM9MApkPTAKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBnMSwgZzIsIGczCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZzEgKCkgeyAgICAgICAgICAgICAgICAgIyBzaWduYXR1cmU6IGcxKGludCBiIDsgaW50IGMpCiAgICBsb2NhbCBiPSQxIGM9JDIKICAgIHByaW50ZiAnJWQgJWQgJWQgJWRcbicgIiRhIiAiJGIiICIkYyIgIiR7ZDotMH0iCn0KCmcyICgpIHsgICAgICAgICAgICAgICAgICMgc2lnbmF0dXJlOiBnMihpbnQgYSA7IGludCBjKQogICAgbG9jYWwgYT0kMSBjPSQyCiAgICBnMSAiJGEiICIkYyIKfQoKZzMgKCkgeyAgICAgICAgICAgICAgICAgIyBzaWduYXR1cmU6IGczKGludCBjIDsgaW50IGEpCiAgICBsb2NhbCBjPSQxIGE9JDIKCiAgICBsb2NhbCBiPTMKICAgIGcxICIkYSIgIiRiIiAgICAgICAgIyBmaXJzdCBwcmludC1saW5lCgogICAgIyAtLS0tLS0tLSBpbm5lciBibG9jayAtLS0tLS0tLQogICAgbG9jYWwgYz04ICAgICAgICAgICAjIHNoYWRvd3MgdGhlIHBhcmFtZXRlciBjCiAgICBsb2NhbCBkPTQKICAgIGcyICIkYSIgIiRiIiAgICAgICAgIyBzZWNvbmQgcHJpbnQtbGluZQogICAgdW5zZXQgZCAgICAgICAgICAgICAjIGVuZCBvZiBpbm5lciBibG9jayDigJMgcmVzdG9yZSBvbGRlciDigJhk4oCZCiAgICAjIC0tLS0tLS0tIGVuZCBibG9jayAtLS0tLS0tLS0KCiAgICBnMSAiJGEiICIkYiIgICAgICAgICMgdGhpcmQgcHJpbnQtbGluZQogICAgZWNobyAiJGIiICAgICAgICAgICAjIOKAnHJldHVybuKAnSB2YWx1ZQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgbWFpbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCm1haW4gKCkgewogICAgbG9jYWwgYT00CiAgICBsb2NhbCBiPTUKICAgIGE9JChnMyAiJGIiICIkYyIpICAgIyBjIGlzIHN0aWxsIHRoZSBnbG9iYWwgMAogICAgZzMgIiRiIiAiJGEiCn0KCm1haW4K