This is a read-only snapshot of the ComputerCraft forums, taken in April 2020.
NewbieProgrammer1047's profile picture

Ummmm...

Started by NewbieProgrammer1047, 19 September 2015 - 04:26 PM
NewbieProgrammer1047 #1
Posted 19 September 2015 - 06:26 PM
So uh, I'm pretty new to ComputerCraft, and I came across a problem. Here's my code:

http://pastebin.com/mRTujrBN

So as you can see, if someone enters a word that isn't stop, the program gets an error message. And I know this is pointless but I'm trying to make programs with complete functionality, for self-teaching purposes. I just can't think of a way to fix it, since I need to make the string into a number for the if statement. Help?
Dustmuz #2
Posted 19 September 2015 - 08:34 PM
if i understand your program right, and what you are trying to do.. you are missing 1line of code..


function squarethings()
  local e, i = " ", 1
  print("Up to what number should I square:")
  e = read()
  if e == "stop" then
	print("Happy to oblige.")
	return
  else
	e = e + 1
	if i < e then
	  repeat
	   local squared = i * i
	   print(i.." x "..i.." = "..squared)
	   sleep(0.3)
	   i = i + 1 - this is the line you missed
	  until i == e
	  squarethings()
	else
	  print("Error, number already squared, or a word has been inputted. Try again.")
	  sleep(0.2)
	  squarethings()
	end
  end
end
squarethings()
Edited on 19 September 2015 - 06:34 PM
HPWebcamAble #3
Posted 20 September 2015 - 03:32 PM
In CC's Lua, Recursive functions only work 256 times.

A recursive call is when you call a function inside of itself:

function squarethings()
  --# some code
  squarethings() --# Makes it recursive
end

You can fix this by using a tail call.
Its really easy to do, just return the function:

function squarethings()
  --# some code
  return squarethings()
end

Let us know if you need help with something else :)/>
NewbieProgrammer1047 #4
Posted 20 September 2015 - 09:06 PM
if i understand your program right, and what you are trying to do.. you are missing 1line of code..


function squarethings()
  local e, i = " ", 1
  print("Up to what number should I square:")
  e = read()
  if e == "stop" then
	print("Happy to oblige.")
	return
  else
	e = e + 1
	if i < e then
	  repeat
	   local squared = i * i
	   print(i.." x "..i.." = "..squared)
	   sleep(0.3)
	   i = i + 1 - this is the line you missed
	  until i == e
	  squarethings()
	else
	  print("Error, number already squared, or a word has been inputted. Try again.")
	  sleep(0.2)
	  squarethings()
	end
  end
end
squarethings()
That was just a mistake. I have that line in the program. Could you tell me how to fix the problem with trying to do arithmetic with e, if it's a word like llama or something?
In CC's Lua, Recursive functions only work 256 times.

A recursive call is when you call a function inside of itself:

function squarethings()
  --# some code
  squarethings() --# Makes it recursive
end

You can fix this by using a tail call.
Its really easy to do, just return the function:

function squarethings()
  --# some code
  return squarethings()
end

Let us know if you need help with something else :)/>
Uh… I guess… thanks? But could you fix the problem that I asked about? Again, this is my code.


function squarethings()
  local e, i = " ", 1
  print("Up to what number should I square:")
  e = read()
  if e == "stop" then
    print("Happy to oblige.")
    return
  else
    e = e + 1
    if i < e then
      repeat
       local squared = i * i
       print(i.." x "..i.." = "..squared)
       sleep(0.3)
	   i = i + 1
      until i == e
      squarethings()
    else
      print("Error, number already squared, or a word has been inputted. Try again.")
      sleep(0.2)
      squarethings()
    end
  end
end
squarethings()


Help.
Dog #5
Posted 20 September 2015 - 09:24 PM
I would recommend doing this with your first else statement

else
  e = tonumber(e)   --# this converts e to a number; if it's a non-numeric value (such as a word or letter) then it will be nil
  if e and i < e then --# this checks that e isn't nil then does your check for i < e (this replaces your if i < e then statement)

You should also pay close attention to what HPWebcamAble said about recursion, your program will eventually crash out if someone uses it long enough. Instead of calling squarethings() from within squarethings(), I'd recommend wrapping your initial call to squarethings() in an infinite loop instead and remove your other two calls. This will eliminate your recursion problem altogether…

function squarethings()
  --# code here, no calls to squarethings()
end

while true do
  squarethings()
end
Edited on 20 September 2015 - 07:49 PM
NewbieProgrammer1047 #6
Posted 20 September 2015 - 10:30 PM
I would recommend doing this with your first else statement

else
  e = tonumber(e)   --# this converts e to a number; if it's a non-numeric value (such as a word or letter) then it will be nil
  if e and i < e then --# this checks that e isn't nil then does your check for i < e (this replaces your if i < e then statement)

You should also pay close attention to what HPWebcamAble said about recursion, your program will eventually crash out if someone uses it long enough. Instead of calling squarethings() from within squarethings(), I'd recommend wrapping your initial call to squarethings() in an infinite loop instead and remove your other two calls. This will eliminate your recursion problem altogether…

function squarethings()
  --# code here, no calls to squarethings()
end

while true do
  squarethings()
end

Okay… so this is what I'd do?


function squarethings()
  local e, i = " ", 1
  print("Up to what number should I square:")
  e = read()
  if e == "stop" then
    print("Happy to oblige.")
    return
  else
    e = tonumber(e)
    if e and i < e then
      repeat
       local squared = i * i
       print(i.." x "..i.." = "..squared)
       sleep(0.3)
           i = i + 1
      until i == e
    else
      print("Error, number already squared, or a word has been inputted. Try again.")
      sleep(0.2)
    end
  end
end

while true do
  squarethings()
end


Explain the recursion problem to me, and also explain the if e and i < e statement please.
TYKUHN2 #7
Posted 20 September 2015 - 11:22 PM
Another way to fix it is to do

if type(e) ~= "number" then
	--# Error code here
end

Dog's works perfectly fine but for future reference type() is useful.
Edited on 20 September 2015 - 09:34 PM
KingofGamesYami #8
Posted 20 September 2015 - 11:23 PM
Just a note: != isn't a thing in Lua. In lua, you use ~= for "not equal to"
TYKUHN2 #9
Posted 20 September 2015 - 11:25 PM
I sometimes mix it up so when I code I always double check.
HPWebcamAble #10
Posted 20 September 2015 - 11:32 PM

if type(e) ~= number then

And number should be a string
TYKUHN2 #11
Posted 20 September 2015 - 11:34 PM
I promise to you I get it right 100% of the time I actually make the code! I swear!
NewbieProgrammer1047 #12
Posted 02 October 2015 - 03:01 PM
I want to know why the code Dog gave me will work
Dog #13
Posted 02 October 2015 - 04:37 PM
Recursion occurs when you call a function from within itself. When you were calling squarethings() from within squarethings() you were creating recursion. Basically you were starting the function again before it stopped the last time. You can only do that 256 times before the program will crash. I had you call squarethings() from within an infinite loop that was outside of squarethings() - that way squarethings() gets called repeatedly, but not from within squarethings() - therefor there is no recursion.

As for

if e and i < e then

First I converted e to a number using tonumber() (e.g. the string "7" will be converted to the number 7) - if e can't be converted to a number (e.g. e == "fish") then it will be nil. Next I checked that e was not nil with the first part of my statement 'if e' - that's the equivalent of…

if e == true

If e is nil (or false) it won't evaluate to true and therefor will go to your else statement. If, on the other hand, e is not nil and is actually a number then Lua will continue with the next check in my if statement 'and i < e' - so long as i is less than e then the statement will continue to your squaring code. If i is equal to or greater than e then the code will go to the else statement.

so…

if e and i < e then
basically says, "If e is true and i is less than e then continue"
Edited on 02 October 2015 - 02:43 PM
NewbieProgrammer1047 #14
Posted 02 October 2015 - 05:52 PM
Recursion occurs when you call a function from within itself. When you were calling squarethings() from within squarethings() you were creating recursion. Basically you were starting the function again before it stopped the last time. You can only do that 256 times before the program will crash. I had you call squarethings() from within an infinite loop that was outside of squarethings() - that way squarethings() gets called repeatedly, but not from within squarethings() - therefor there is no recursion.

As for

if e and i < e then

First I converted e to a number using tonumber() (e.g. the string "7" will be converted to the number 7) - if e can't be converted to a number (e.g. e == "fish") then it will be nil. Next I checked that e was not nil with the first part of my statement 'if e' - that's the equivalent of…

if e == true

If e is nil (or false) it won't evaluate to true and therefor will go to your else statement. If, on the other hand, e is not nil and is actually a number then Lua will continue with the next check in my if statement 'and i < e' - so long as i is less than e then the statement will continue to your squaring code. If i is equal to or greater than e then the code will go to the else statement.

so…

if e and i < e then
basically says, "If e is true and i is less than e then continue"
Ah… thanks!
NewbieProgrammer1047 #15
Posted 02 October 2015 - 06:45 PM
Recursion occurs when you call a function from within itself. When you were calling squarethings() from within squarethings() you were creating recursion. Basically you were starting the function again before it stopped the last time. You can only do that 256 times before the program will crash. I had you call squarethings() from within an infinite loop that was outside of squarethings() - that way squarethings() gets called repeatedly, but not from within squarethings() - therefor there is no recursion.

As for

if e and i < e then

First I converted e to a number using tonumber() (e.g. the string "7" will be converted to the number 7) - if e can't be converted to a number (e.g. e == "fish") then it will be nil. Next I checked that e was not nil with the first part of my statement 'if e' - that's the equivalent of…

if e == true

If e is nil (or false) it won't evaluate to true and therefor will go to your else statement. If, on the other hand, e is not nil and is actually a number then Lua will continue with the next check in my if statement 'and i < e' - so long as i is less than e then the statement will continue to your squaring code. If i is equal to or greater than e then the code will go to the else statement.

so…

if e and i < e then
basically says, "If e is true and i is less than e then continue"
EDIT 3: Getting rid of my old nonsense, anyway… it's broken now. It starts back at the beginning of the number now. Unsure why it does this.
Edited on 02 October 2015 - 04:53 PM
Dog #16
Posted 09 October 2015 - 07:06 PM
Post your code as it is now so I can see what changes you've made.
NewbieProgrammer1047 #17
Posted 06 November 2015 - 07:41 PM
Post your code as it is now so I can see what changes you've made.

The thing I was using to do my ComputerCraft programming has been broken since a little before you asked this, so I'm not dead, I've just been trying to fix the problem. I know you didn't ask about this, but I just felt like I needed to explain why I haven't shown you.
Edited on 06 November 2015 - 06:42 PM
Dog #18
Posted 06 November 2015 - 08:57 PM
No worries - post what you've got when you can and we'll go from there :)/>