Hello Dave,
I am reading your newest FAQ! It becomes more and more perfect, IMHO
;-) But unfortunately I have to disturb you again ... please be
patient with me :-}
2.3 When does a local variable become accessible?
A local variable becomes accessible after the first assignment
statement to that variable appears in the source (which is not the
same as the first time an assignment statement is executed).
Your explaination is ok, but, IMHO, I feel we could describe it more
explicite.
We should explain the user, that the compiler has to decide on compile
time, whether a mentioned symbol means variable access or method call
(performance and architectural reasons; variable access is *very*
difficult from method invocation).
On runtime the interpreter will execute whatever was compiled
(variable access or method invocation). This can be very surprising
and could result in a difficult to locate bug, probably!
If you consider the example below you will find, that there is no
error message printed by ruby. But the result will be very
surprising, I guess ;-)
def a
print "Function 'a' called!\n"
99
end
for i in 1..2
if i == 2
print "a=", a, "\n"
else
a = 1
print "a=", a, "\n"
end
end
What do you think?
3.3 How is a block used in an iterator?
Nice, but could you explicite explain, that blocks are not consumed by
'Proc.new', 'lambda' and 'proc'? So the last example would become more
clear. If not, I could ask myself with what block does 'proc' operate
with? Because the block was already used by 'Proc.new'!
4.1 What does :var mean?
Again, I cannot see the reason why it is important for the user to
know, that the ':var' form will create local symbols.
Your example would also work with:
NORTH = "NORTH".intern
SOUTH = "SOUTH".intern
EAST = "EAST".intern
WEST = "WEST".intern
Ugly ... but possible. For me (the user), I could think of ':var' as
intern aliasing of '"var".intern'. I do not need the knowledge, that
':var' will create a local symbol. Please look the following example:
print "Before catch\n"
catch("WWW".intern) do
print "Before throw\n"
throw "WWW".intern
print "After throw\n"
end
print "After catch\n"
Do you see any reason I should know this special internal thing?
4.2 How can I access the value of a symbol?
If you ask this question, would it make sense also to ask: How can I
access the method behind a symbol?
Regards,
\cle