typeset in ksh93 not working as expected
I thought typeset
was ksh
's local
, but this fails in ksh93
although it works in all my other typeset
-supporting shells (bash, yash, zsh, pdksh)
#!/bin/ksh -ex
foo(){
typeset a b
a=0; b=1
return
}
a=a; b=b
foo
#confirm that the globals didn't change
[ "$a" = a ]
[ "$b" = b ]
What gives?
shell ksh typeset
add a comment |
I thought typeset
was ksh
's local
, but this fails in ksh93
although it works in all my other typeset
-supporting shells (bash, yash, zsh, pdksh)
#!/bin/ksh -ex
foo(){
typeset a b
a=0; b=1
return
}
a=a; b=b
foo
#confirm that the globals didn't change
[ "$a" = a ]
[ "$b" = b ]
What gives?
shell ksh typeset
add a comment |
I thought typeset
was ksh
's local
, but this fails in ksh93
although it works in all my other typeset
-supporting shells (bash, yash, zsh, pdksh)
#!/bin/ksh -ex
foo(){
typeset a b
a=0; b=1
return
}
a=a; b=b
foo
#confirm that the globals didn't change
[ "$a" = a ]
[ "$b" = b ]
What gives?
shell ksh typeset
I thought typeset
was ksh
's local
, but this fails in ksh93
although it works in all my other typeset
-supporting shells (bash, yash, zsh, pdksh)
#!/bin/ksh -ex
foo(){
typeset a b
a=0; b=1
return
}
a=a; b=b
foo
#confirm that the globals didn't change
[ "$a" = a ]
[ "$b" = b ]
What gives?
shell ksh typeset
shell ksh typeset
asked Jul 4 '17 at 9:23
PSkocikPSkocik
17.9k44995
17.9k44995
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
typeset
is ksh93's private
(using static scoping like perl
's my
, not local
which does dynamic scoping) only for functions that are declared using the ksh function definition style:
function foo {
typeset var=whatever
...
}
With the Bourne syntax (or with the .
command (which btw, can also be used on ksh-style functions)), there's no scoping (except for $1
, $2
... $#
of course). So one can use Bourne-style functions to get the value or change the value or type of a variable in the parent context (though typeset -n
can also be used for that with the ksh-style.
In ksh88, typeset
was doing dynamic scoping with both the ksh and Bourne function definition style. According to David Korn, POSIX did not specify ksh's variable scoping on the basis that it was dynamic (deemed inferior) which is why he changed it to static scoping for ksh93
(a complete rewrite).
But in the mean time, other shells have implemented variable scoping and they all did it using dynamic scoping to mimic ksh88's.
zsh
now has a private
keyword to have scoping similar to ksh93
's in addition to local
/typeset
with dynamic scoping like in ksh88
.
To see the difference between static and dynamic scoping, compare:
"$shell" -c 'function f { typeset a=1; g; echo "$a"; }
function g { echo "$a"; a=2; }
a=0; f'
Which with $shell
== ksh93
outputs:
0
1
And with ksh88
or bash
outputs:
1
2
zsh
:
$ zsh -c 'zmodload zsh/param/private
f() { private a=1; g; echo $a;}
g() { echo $a; a=2; }
a=0; f'
0
1
To be able to use local scope in code portable to bash
, zsh
, ksh88
ksh93
, pdksh
, yash
or dash
/FreeBSD
sh, you could do:
[ -n "$BASH_VERSION" ] && shopt -s expand_aliases
alias shdef= kshdef='#'
if type typeset > /dev/null 2>&1; then
alias mylocal=typeset
if (a=1; f() { typeset a=2; }; f; [ "$a" = 2 ]); then
alias shdef='#' kshdef='function'
fi
else
alias mylocal=local
fi
And then declare your functions as:
kshdef foo
shdef foo()
{
mylocal var
var=value
...
}
In any case, there are many differences between the behaviour of those local
in the various shells. Beside the dynamic vs static consideration mentioned above, there's whether variables initially get an unset or empty value or inherit the value from the parent scope. And there's the interaction with readonly
, unset
, whether local
/typeset
is a keyword or builtin (affects split+glob handling)...
There are other implications of using the ksh-style function definition in ksh93
, see the man page for details.
More reading
http://austingroupbugs.net/view.php?id=767 for the POSIX effort to standardize local scope insh
.- List of shells support `local` keyword for defining local variables
Thanks. Do you know if it's possible to get the same effect aslocal
in ksh93 in without thefunction
-based function definitions? The reason I'm asking is I have a bunch of mostly POSIX code except with local variables and so I thought I'd make it more portable by replacing thelocal
declarations witheval $current_shells_local_keyword $the_variables
.
– PSkocik
Jul 4 '17 at 9:42
@PSkocik, you may want to have a look at github.com/modernish/modernish
– Stéphane Chazelas
Jul 4 '17 at 9:43
1
@PSkocik, see edit for one approach.
– Stéphane Chazelas
Jul 4 '17 at 10:08
I like your approach but ksh support wasn't essential, and I ended up ignoring it and simply doing alias local=typeset for yash. With that, my code appears to be correct in dash, bash, yash, posh, and zsh, as long as I don't rely on a specific type of scoping, the local values being auto-initialized to empty (in some shells they aren't), and on local being a keyword (local a=$b
is nonportable butlocal a="$b"
orlocal a; a=$b
appears to work across all the shells). Thanks for the help.
– PSkocik
Jul 5 '17 at 15:36
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f375156%2ftypeset-in-ksh93-not-working-as-expected%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
typeset
is ksh93's private
(using static scoping like perl
's my
, not local
which does dynamic scoping) only for functions that are declared using the ksh function definition style:
function foo {
typeset var=whatever
...
}
With the Bourne syntax (or with the .
command (which btw, can also be used on ksh-style functions)), there's no scoping (except for $1
, $2
... $#
of course). So one can use Bourne-style functions to get the value or change the value or type of a variable in the parent context (though typeset -n
can also be used for that with the ksh-style.
In ksh88, typeset
was doing dynamic scoping with both the ksh and Bourne function definition style. According to David Korn, POSIX did not specify ksh's variable scoping on the basis that it was dynamic (deemed inferior) which is why he changed it to static scoping for ksh93
(a complete rewrite).
But in the mean time, other shells have implemented variable scoping and they all did it using dynamic scoping to mimic ksh88's.
zsh
now has a private
keyword to have scoping similar to ksh93
's in addition to local
/typeset
with dynamic scoping like in ksh88
.
To see the difference between static and dynamic scoping, compare:
"$shell" -c 'function f { typeset a=1; g; echo "$a"; }
function g { echo "$a"; a=2; }
a=0; f'
Which with $shell
== ksh93
outputs:
0
1
And with ksh88
or bash
outputs:
1
2
zsh
:
$ zsh -c 'zmodload zsh/param/private
f() { private a=1; g; echo $a;}
g() { echo $a; a=2; }
a=0; f'
0
1
To be able to use local scope in code portable to bash
, zsh
, ksh88
ksh93
, pdksh
, yash
or dash
/FreeBSD
sh, you could do:
[ -n "$BASH_VERSION" ] && shopt -s expand_aliases
alias shdef= kshdef='#'
if type typeset > /dev/null 2>&1; then
alias mylocal=typeset
if (a=1; f() { typeset a=2; }; f; [ "$a" = 2 ]); then
alias shdef='#' kshdef='function'
fi
else
alias mylocal=local
fi
And then declare your functions as:
kshdef foo
shdef foo()
{
mylocal var
var=value
...
}
In any case, there are many differences between the behaviour of those local
in the various shells. Beside the dynamic vs static consideration mentioned above, there's whether variables initially get an unset or empty value or inherit the value from the parent scope. And there's the interaction with readonly
, unset
, whether local
/typeset
is a keyword or builtin (affects split+glob handling)...
There are other implications of using the ksh-style function definition in ksh93
, see the man page for details.
More reading
http://austingroupbugs.net/view.php?id=767 for the POSIX effort to standardize local scope insh
.- List of shells support `local` keyword for defining local variables
Thanks. Do you know if it's possible to get the same effect aslocal
in ksh93 in without thefunction
-based function definitions? The reason I'm asking is I have a bunch of mostly POSIX code except with local variables and so I thought I'd make it more portable by replacing thelocal
declarations witheval $current_shells_local_keyword $the_variables
.
– PSkocik
Jul 4 '17 at 9:42
@PSkocik, you may want to have a look at github.com/modernish/modernish
– Stéphane Chazelas
Jul 4 '17 at 9:43
1
@PSkocik, see edit for one approach.
– Stéphane Chazelas
Jul 4 '17 at 10:08
I like your approach but ksh support wasn't essential, and I ended up ignoring it and simply doing alias local=typeset for yash. With that, my code appears to be correct in dash, bash, yash, posh, and zsh, as long as I don't rely on a specific type of scoping, the local values being auto-initialized to empty (in some shells they aren't), and on local being a keyword (local a=$b
is nonportable butlocal a="$b"
orlocal a; a=$b
appears to work across all the shells). Thanks for the help.
– PSkocik
Jul 5 '17 at 15:36
add a comment |
typeset
is ksh93's private
(using static scoping like perl
's my
, not local
which does dynamic scoping) only for functions that are declared using the ksh function definition style:
function foo {
typeset var=whatever
...
}
With the Bourne syntax (or with the .
command (which btw, can also be used on ksh-style functions)), there's no scoping (except for $1
, $2
... $#
of course). So one can use Bourne-style functions to get the value or change the value or type of a variable in the parent context (though typeset -n
can also be used for that with the ksh-style.
In ksh88, typeset
was doing dynamic scoping with both the ksh and Bourne function definition style. According to David Korn, POSIX did not specify ksh's variable scoping on the basis that it was dynamic (deemed inferior) which is why he changed it to static scoping for ksh93
(a complete rewrite).
But in the mean time, other shells have implemented variable scoping and they all did it using dynamic scoping to mimic ksh88's.
zsh
now has a private
keyword to have scoping similar to ksh93
's in addition to local
/typeset
with dynamic scoping like in ksh88
.
To see the difference between static and dynamic scoping, compare:
"$shell" -c 'function f { typeset a=1; g; echo "$a"; }
function g { echo "$a"; a=2; }
a=0; f'
Which with $shell
== ksh93
outputs:
0
1
And with ksh88
or bash
outputs:
1
2
zsh
:
$ zsh -c 'zmodload zsh/param/private
f() { private a=1; g; echo $a;}
g() { echo $a; a=2; }
a=0; f'
0
1
To be able to use local scope in code portable to bash
, zsh
, ksh88
ksh93
, pdksh
, yash
or dash
/FreeBSD
sh, you could do:
[ -n "$BASH_VERSION" ] && shopt -s expand_aliases
alias shdef= kshdef='#'
if type typeset > /dev/null 2>&1; then
alias mylocal=typeset
if (a=1; f() { typeset a=2; }; f; [ "$a" = 2 ]); then
alias shdef='#' kshdef='function'
fi
else
alias mylocal=local
fi
And then declare your functions as:
kshdef foo
shdef foo()
{
mylocal var
var=value
...
}
In any case, there are many differences between the behaviour of those local
in the various shells. Beside the dynamic vs static consideration mentioned above, there's whether variables initially get an unset or empty value or inherit the value from the parent scope. And there's the interaction with readonly
, unset
, whether local
/typeset
is a keyword or builtin (affects split+glob handling)...
There are other implications of using the ksh-style function definition in ksh93
, see the man page for details.
More reading
http://austingroupbugs.net/view.php?id=767 for the POSIX effort to standardize local scope insh
.- List of shells support `local` keyword for defining local variables
Thanks. Do you know if it's possible to get the same effect aslocal
in ksh93 in without thefunction
-based function definitions? The reason I'm asking is I have a bunch of mostly POSIX code except with local variables and so I thought I'd make it more portable by replacing thelocal
declarations witheval $current_shells_local_keyword $the_variables
.
– PSkocik
Jul 4 '17 at 9:42
@PSkocik, you may want to have a look at github.com/modernish/modernish
– Stéphane Chazelas
Jul 4 '17 at 9:43
1
@PSkocik, see edit for one approach.
– Stéphane Chazelas
Jul 4 '17 at 10:08
I like your approach but ksh support wasn't essential, and I ended up ignoring it and simply doing alias local=typeset for yash. With that, my code appears to be correct in dash, bash, yash, posh, and zsh, as long as I don't rely on a specific type of scoping, the local values being auto-initialized to empty (in some shells they aren't), and on local being a keyword (local a=$b
is nonportable butlocal a="$b"
orlocal a; a=$b
appears to work across all the shells). Thanks for the help.
– PSkocik
Jul 5 '17 at 15:36
add a comment |
typeset
is ksh93's private
(using static scoping like perl
's my
, not local
which does dynamic scoping) only for functions that are declared using the ksh function definition style:
function foo {
typeset var=whatever
...
}
With the Bourne syntax (or with the .
command (which btw, can also be used on ksh-style functions)), there's no scoping (except for $1
, $2
... $#
of course). So one can use Bourne-style functions to get the value or change the value or type of a variable in the parent context (though typeset -n
can also be used for that with the ksh-style.
In ksh88, typeset
was doing dynamic scoping with both the ksh and Bourne function definition style. According to David Korn, POSIX did not specify ksh's variable scoping on the basis that it was dynamic (deemed inferior) which is why he changed it to static scoping for ksh93
(a complete rewrite).
But in the mean time, other shells have implemented variable scoping and they all did it using dynamic scoping to mimic ksh88's.
zsh
now has a private
keyword to have scoping similar to ksh93
's in addition to local
/typeset
with dynamic scoping like in ksh88
.
To see the difference between static and dynamic scoping, compare:
"$shell" -c 'function f { typeset a=1; g; echo "$a"; }
function g { echo "$a"; a=2; }
a=0; f'
Which with $shell
== ksh93
outputs:
0
1
And with ksh88
or bash
outputs:
1
2
zsh
:
$ zsh -c 'zmodload zsh/param/private
f() { private a=1; g; echo $a;}
g() { echo $a; a=2; }
a=0; f'
0
1
To be able to use local scope in code portable to bash
, zsh
, ksh88
ksh93
, pdksh
, yash
or dash
/FreeBSD
sh, you could do:
[ -n "$BASH_VERSION" ] && shopt -s expand_aliases
alias shdef= kshdef='#'
if type typeset > /dev/null 2>&1; then
alias mylocal=typeset
if (a=1; f() { typeset a=2; }; f; [ "$a" = 2 ]); then
alias shdef='#' kshdef='function'
fi
else
alias mylocal=local
fi
And then declare your functions as:
kshdef foo
shdef foo()
{
mylocal var
var=value
...
}
In any case, there are many differences between the behaviour of those local
in the various shells. Beside the dynamic vs static consideration mentioned above, there's whether variables initially get an unset or empty value or inherit the value from the parent scope. And there's the interaction with readonly
, unset
, whether local
/typeset
is a keyword or builtin (affects split+glob handling)...
There are other implications of using the ksh-style function definition in ksh93
, see the man page for details.
More reading
http://austingroupbugs.net/view.php?id=767 for the POSIX effort to standardize local scope insh
.- List of shells support `local` keyword for defining local variables
typeset
is ksh93's private
(using static scoping like perl
's my
, not local
which does dynamic scoping) only for functions that are declared using the ksh function definition style:
function foo {
typeset var=whatever
...
}
With the Bourne syntax (or with the .
command (which btw, can also be used on ksh-style functions)), there's no scoping (except for $1
, $2
... $#
of course). So one can use Bourne-style functions to get the value or change the value or type of a variable in the parent context (though typeset -n
can also be used for that with the ksh-style.
In ksh88, typeset
was doing dynamic scoping with both the ksh and Bourne function definition style. According to David Korn, POSIX did not specify ksh's variable scoping on the basis that it was dynamic (deemed inferior) which is why he changed it to static scoping for ksh93
(a complete rewrite).
But in the mean time, other shells have implemented variable scoping and they all did it using dynamic scoping to mimic ksh88's.
zsh
now has a private
keyword to have scoping similar to ksh93
's in addition to local
/typeset
with dynamic scoping like in ksh88
.
To see the difference between static and dynamic scoping, compare:
"$shell" -c 'function f { typeset a=1; g; echo "$a"; }
function g { echo "$a"; a=2; }
a=0; f'
Which with $shell
== ksh93
outputs:
0
1
And with ksh88
or bash
outputs:
1
2
zsh
:
$ zsh -c 'zmodload zsh/param/private
f() { private a=1; g; echo $a;}
g() { echo $a; a=2; }
a=0; f'
0
1
To be able to use local scope in code portable to bash
, zsh
, ksh88
ksh93
, pdksh
, yash
or dash
/FreeBSD
sh, you could do:
[ -n "$BASH_VERSION" ] && shopt -s expand_aliases
alias shdef= kshdef='#'
if type typeset > /dev/null 2>&1; then
alias mylocal=typeset
if (a=1; f() { typeset a=2; }; f; [ "$a" = 2 ]); then
alias shdef='#' kshdef='function'
fi
else
alias mylocal=local
fi
And then declare your functions as:
kshdef foo
shdef foo()
{
mylocal var
var=value
...
}
In any case, there are many differences between the behaviour of those local
in the various shells. Beside the dynamic vs static consideration mentioned above, there's whether variables initially get an unset or empty value or inherit the value from the parent scope. And there's the interaction with readonly
, unset
, whether local
/typeset
is a keyword or builtin (affects split+glob handling)...
There are other implications of using the ksh-style function definition in ksh93
, see the man page for details.
More reading
http://austingroupbugs.net/view.php?id=767 for the POSIX effort to standardize local scope insh
.- List of shells support `local` keyword for defining local variables
edited 6 mins ago
answered Jul 4 '17 at 9:31
Stéphane ChazelasStéphane Chazelas
303k56570924
303k56570924
Thanks. Do you know if it's possible to get the same effect aslocal
in ksh93 in without thefunction
-based function definitions? The reason I'm asking is I have a bunch of mostly POSIX code except with local variables and so I thought I'd make it more portable by replacing thelocal
declarations witheval $current_shells_local_keyword $the_variables
.
– PSkocik
Jul 4 '17 at 9:42
@PSkocik, you may want to have a look at github.com/modernish/modernish
– Stéphane Chazelas
Jul 4 '17 at 9:43
1
@PSkocik, see edit for one approach.
– Stéphane Chazelas
Jul 4 '17 at 10:08
I like your approach but ksh support wasn't essential, and I ended up ignoring it and simply doing alias local=typeset for yash. With that, my code appears to be correct in dash, bash, yash, posh, and zsh, as long as I don't rely on a specific type of scoping, the local values being auto-initialized to empty (in some shells they aren't), and on local being a keyword (local a=$b
is nonportable butlocal a="$b"
orlocal a; a=$b
appears to work across all the shells). Thanks for the help.
– PSkocik
Jul 5 '17 at 15:36
add a comment |
Thanks. Do you know if it's possible to get the same effect aslocal
in ksh93 in without thefunction
-based function definitions? The reason I'm asking is I have a bunch of mostly POSIX code except with local variables and so I thought I'd make it more portable by replacing thelocal
declarations witheval $current_shells_local_keyword $the_variables
.
– PSkocik
Jul 4 '17 at 9:42
@PSkocik, you may want to have a look at github.com/modernish/modernish
– Stéphane Chazelas
Jul 4 '17 at 9:43
1
@PSkocik, see edit for one approach.
– Stéphane Chazelas
Jul 4 '17 at 10:08
I like your approach but ksh support wasn't essential, and I ended up ignoring it and simply doing alias local=typeset for yash. With that, my code appears to be correct in dash, bash, yash, posh, and zsh, as long as I don't rely on a specific type of scoping, the local values being auto-initialized to empty (in some shells they aren't), and on local being a keyword (local a=$b
is nonportable butlocal a="$b"
orlocal a; a=$b
appears to work across all the shells). Thanks for the help.
– PSkocik
Jul 5 '17 at 15:36
Thanks. Do you know if it's possible to get the same effect as
local
in ksh93 in without the function
-based function definitions? The reason I'm asking is I have a bunch of mostly POSIX code except with local variables and so I thought I'd make it more portable by replacing the local
declarations with eval $current_shells_local_keyword $the_variables
.– PSkocik
Jul 4 '17 at 9:42
Thanks. Do you know if it's possible to get the same effect as
local
in ksh93 in without the function
-based function definitions? The reason I'm asking is I have a bunch of mostly POSIX code except with local variables and so I thought I'd make it more portable by replacing the local
declarations with eval $current_shells_local_keyword $the_variables
.– PSkocik
Jul 4 '17 at 9:42
@PSkocik, you may want to have a look at github.com/modernish/modernish
– Stéphane Chazelas
Jul 4 '17 at 9:43
@PSkocik, you may want to have a look at github.com/modernish/modernish
– Stéphane Chazelas
Jul 4 '17 at 9:43
1
1
@PSkocik, see edit for one approach.
– Stéphane Chazelas
Jul 4 '17 at 10:08
@PSkocik, see edit for one approach.
– Stéphane Chazelas
Jul 4 '17 at 10:08
I like your approach but ksh support wasn't essential, and I ended up ignoring it and simply doing alias local=typeset for yash. With that, my code appears to be correct in dash, bash, yash, posh, and zsh, as long as I don't rely on a specific type of scoping, the local values being auto-initialized to empty (in some shells they aren't), and on local being a keyword (
local a=$b
is nonportable but local a="$b"
or local a; a=$b
appears to work across all the shells). Thanks for the help.– PSkocik
Jul 5 '17 at 15:36
I like your approach but ksh support wasn't essential, and I ended up ignoring it and simply doing alias local=typeset for yash. With that, my code appears to be correct in dash, bash, yash, posh, and zsh, as long as I don't rely on a specific type of scoping, the local values being auto-initialized to empty (in some shells they aren't), and on local being a keyword (
local a=$b
is nonportable but local a="$b"
or local a; a=$b
appears to work across all the shells). Thanks for the help.– PSkocik
Jul 5 '17 at 15:36
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f375156%2ftypeset-in-ksh93-not-working-as-expected%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown