[M3devel] add/subtract in Quake
Jay K
jay.krell at cornell.edu
Thu Jul 1 16:45:18 CEST 2010
Folks might find this amusing or useful. I actually think I'm going to use it, just for the numbers 0-64.It implements addition and subtraction for a fixed range, here 0-9999Global variables are only used for initialization.Thereafter, just global constants (no enforcement of that, but I think it could be done by having initialization return them).
Approach is that adding 1 to a single digit can be done with a small map.Adding 1 to multiple digits can be done using multiple variables and checking for "wraparound" to 0 (the table maps 9 to 0).You count up to 9999, filling in an Add1 and Sub1 hash table as you go up. I don't think quake has an appropriate looping mechanism, so counting up to 9999 is done recursively.Then Add and Sub are implemented recursively like Add1{Add(a, Sub1(b)}.
local Add1 = { }local Sub1 = { }
local counter0 = 0local counter1 = 0local counter2 = 0local counter3 = 0
local proc Increment() is local inc = { 0:1,1:2,2:3,3:4,4:5, 5:6,6:7,7:8,8:9,9:0 } counter0 = inc{counter0} if equal(counter0, 0) counter1 = inc{counter1} if equal(counter1, 0) counter2 = inc{counter2} if equal(counter2, 0) counter3 = inc{counter3} end end end local c = "" foreach d in [counter3, counter2, counter1, counter0] if not equal(d, 0) or not equal(c, "") c = c & d end end return cend
proc InitMath_F1(a, b) is if equal(a, "9999") return end Add1{a} = b Sub1{b} = a InitMath_F1(b, Increment())end
proc InitMath() is counter0 = 0 counter1 = 0 counter2 = 0 counter3 = 0 InitMath_F1(0, Increment())end
proc Add(a, b) is if equal(a, 0) return b end if equal(b, 0) return a end if equal(a, 1) return Add1{b} end if equal(b, 1) return Add1{a} end return Add1{Add(a, Sub1{b})}end
proc Sub(a, b) is if equal(a, 0) return b end if equal(b, 0) return a end if equal(a, 1) return Sub1{b} end if equal(b, 1) return Sub1{a} end return Sub1{Sub(a, Sub1{b})}end
InitMath()write("99 - 40 is " & Sub(99, 40), CR)write("6 - 4 is " & Sub(6, 4), CR)write("3 + 2 is " & Add(2, 3), CR)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20100701/9377c8c2/attachment-0001.html>
More information about the M3devel
mailing list