Notice: Any messages purporting to come from this site telling you that your password has expired, or that you need to verify your details, confirm your email, resolve issues, making threats, or asking for money, are
spam. We do not email users with any such messages. If you have lost your password you can obtain a new one by using the
password reset link.
Due to spam on this forum, all posts now need moderator approval.
Entire forum
➜ MUSHclient
➜ Lua
➜ Useful calculator Alias
It is now over 60 days since the last post. This thread is closed.
Refresh page
Pages: 1 2
3
Posted by
| Henry Tanner
Finland (23 posts) Bio
|
Date
| Wed 18 Aug 2010 02:12 PM (UTC) |
Message
| I have an alias "math *",
which sends:
result = %1
Note ("= " .. result)
to script.
I find myself using this one daily, I hope you can find an use for it :) |
I got this! | Top |
|
Posted by
| Twisol
USA (2,257 posts) Bio
|
Date
| Reply #1 on Wed 18 Aug 2010 05:32 PM (UTC) |
Message
| Definitely a useful alias! I use something slightly different (and perhaps a little more flexible):
<aliases>
<alias
match="^=(.*)$"
regexp="y"
send_to="12"
enabled="y'
ignore_case="y">
<send>print(assert(loadstring("return %1"))())</send>
</alias>
</aliases>
(I might've messed up the XML a little since I wrote that out by hand.) |
'Soludra' on Achaea
Blog: http://jonathan.com/
GitHub: http://github.com/Twisol | Top |
|
Posted by
| David Haley
USA (3,881 posts) Bio
|
Date
| Reply #2 on Wed 18 Aug 2010 07:05 PM (UTC) |
Message
| Why's it more flexible? They seem to both be evaluating an expression and printing it. |
David Haley aka Ksilyan
Head Programmer,
Legends of the Darkstone
http://david.the-haleys.org | Top |
|
Posted by
| Nick Gammon
Australia (23,133 posts) Bio
Forum Administrator |
Date
| Reply #3 on Wed 18 Aug 2010 09:10 PM (UTC) |
Message
| I don't think the loadstring gets you much further down the track, but this variation saves the assignment line:
<aliases>
<alias
match="math *"
enabled="y"
send_to="12"
sequence="100"
>
<send>print ("=", %1)</send>
</alias>
</aliases>
|
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| Nick Gammon
Australia (23,133 posts) Bio
Forum Administrator |
Date
| Reply #4 on Wed 18 Aug 2010 09:35 PM (UTC) Amended on Wed 18 Aug 2010 09:38 PM (UTC) by Nick Gammon
|
Message
| The only problem with that (and the original) is that if you want to do maths-type things like sqrt you have to do math.sqrt or you see something like this:
math sqrt (9)
Run-time error
World: SmaugFUSS
Immediate execution
[string "Alias: "]:1: attempt to call global 'sqrt' (a nil value)
stack traceback:
[string "Alias: "]:1: in main chunk
This rather whimsical alias below solves that by letting you use anything in the math table without having to put "math" in front of it. It's all done in a single "line" (one function call) although I added a couple of linebreaks for readability. I'll leave it as an exercise to work out how it works. Suffice to say that it uses a metatable, and calling a function under a different environment.
<aliases>
<alias
match="math *"
enabled="y"
send_to="12"
sequence="100"
>
<send>
print ("=",
setfenv (function () return %1 end,
setmetatable ( {}, { __index = function (t, n) return math [n] end })) ())
</send>
</alias>
</aliases>
|
For advice on how to copy the above, and paste it into MUSHclient, please see Pasting XML.
|
Testing:
math 45847/3433 --> = 13.354791727352
math abs (-435938+23432) --> = 412506
math log (2343) --> = 7.7591874385078
math 45847*4532 --> = 207778604
math sqrt (128) --> = 11.313708498985
|
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| Nick Gammon
Australia (23,133 posts) Bio
Forum Administrator |
Date
| Reply #5 on Wed 18 Aug 2010 10:25 PM (UTC) |
Message
| Another variation lets you do more stuff (like the string library, the bit library, the utils library) like this:
<aliases>
<alias
match="= *"
enabled="y"
send_to="12"
sequence="100"
>
<send>
print ("=",
setfenv (function () return %1 end,
setmetatable ( {}, { __index = function (t, n)
return math [n] or bit [n] or string [n] or utils [n] end })) ())
</send>
</alias>
</aliases>
This one shortens the alias to "=" to save typing, eg.
= hash ('nick') --> = 2609427bf1f8b42def2bab7d01da5a4fa56db539
= find ('nick cooks', '(co+)') --> = 6 8 coo
= log (3431234) --> = 15.048430521205
Notice that, as in the "find" example, you can get multiple results (the columns and the matching text).
Also notice that if you want to use strings you must put them in single quotes because MUSHclient "helpfully" puts a backslash in front of double quotes. |
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| Twisol
USA (2,257 posts) Bio
|
Date
| Reply #6 on Wed 18 Aug 2010 11:09 PM (UTC) |
Message
| What I did lets you use "", since it's inserted into the loadstring argument.
I never thought about shortcut aliases for namespaces like that, Nick. Very interesting! I just use the general "=math.floor(1.5)" because it mimics the Lua REPL's shorthand. |
'Soludra' on Achaea
Blog: http://jonathan.com/
GitHub: http://github.com/Twisol | Top |
|
Posted by
| Nick Gammon
Australia (23,133 posts) Bio
Forum Administrator |
Date
| Reply #7 on Thu 19 Aug 2010 12:08 AM (UTC) Amended on Thu 19 Aug 2010 12:09 AM (UTC) by Nick Gammon
|
Message
| To use loadstring in my method (removing the need for math.xxx) is fiddlier because the loadstring environment fails. I tried it. ;)
This slightly amended version echoes the original string:
<aliases>
<alias
match="=*"
enabled="y"
send_to="12"
sequence="100"
>
<send>
print ("%1 =",
setfenv (function () return %1 end,
setmetatable ( {}, { __index = function (t, n)
return math [n] or bit [n] or string [n] or utils [n] end })) ())
</send>
</alias>
</aliases>
So you see the "question" next to the "answer" which can be helpful if you are doing a lot of maths. You might wonder which answer refers to which question.
eg.
=5*8 --> 5*8 = 40
=log10(500) --> log10(500) = 2.698970004336
= sqrt (2) --> sqrt (2) = 1.4142135623731
|
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| Twisol
USA (2,257 posts) Bio
|
Date
| Reply #8 on Thu 19 Aug 2010 12:24 AM (UTC) Amended on Thu 19 Aug 2010 12:26 AM (UTC) by Twisol
|
Message
| Hrm, this worked for me:
<aliases>
<alias
match="=*"
enabled="y"
send_to="12"
sequence="100"
>
<send>
local env = setmetatable({}, {
__index = function(t, key)
return math[key] or bit[key] or string[key] or utils[key]
end,
})
print("%1 =", setfenv(assert(loadstring("return %1"), env))())
</send>
</alias>
</aliases>
Test:
=split("4,3,2", ",")
split("4,3,2", ",") = table: 010426E0
|
'Soludra' on Achaea
Blog: http://jonathan.com/
GitHub: http://github.com/Twisol | Top |
|
Posted by
| Nick Gammon
Australia (23,133 posts) Bio
Forum Administrator |
Date
| Reply #9 on Thu 19 Aug 2010 03:46 AM (UTC) Amended on Thu 19 Aug 2010 06:20 AM (UTC) by Nick Gammon
|
Message
| You have a bracket in the wrong spot. If you submit an erroneous expression you get:
=a+
Run-time error
World: SmaugFUSS
Immediate execution
[string "Alias: "]:7: bad argument #2 to 'assert' (string expected, got table)
stack traceback:
[C]: in function 'assert'
[string "Alias: "]:7: in main chunk
This version fixes that:
<aliases>
<alias
match="=*"
enabled="y"
send_to="12"
sequence="100"
>
<send>
local env = setmetatable({}, {
__index = function(t, key)
return math[key] or bit[key] or string[key] or utils[key]
end,
})
print("%1 =", setfenv(assert(loadstring("return %1")), env)())
</send>
</alias>
</aliases>
Now testing:
=a+
Run-time error
World: SmaugFUSS
Immediate execution
[string "Alias: "]:7: [string "return a+"]:1: unexpected symbol near '<eof>'
stack traceback:
[C]: in function 'assert'
[string "Alias: "]:7: in main chunk
And in the spirit of trying to make it as obscure as possible, here is my version without the intermediate variable:
<aliases>
<alias
match="=*"
enabled="y"
send_to="12"
sequence="100"
>
<send>
print ("%1 =", setfenv (assert (loadstring "return %1"), setmetatable ({},
{__index = function (_, n) return math [n] or bit [n] or string [n] or utils [n] or world [n] end}) ) () )
</send>
</alias>
</aliases>
Oh, and thanks to Henry Tanner for kicking off this rather interesting thread. :)
[EDIT] Modified last one to make it shorter. And to add the "world" table. |
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| Nick Gammon
Australia (23,133 posts) Bio
Forum Administrator |
Date
| Reply #10 on Thu 19 Aug 2010 03:51 AM (UTC) Amended on Thu 19 Aug 2010 03:53 AM (UTC) by Nick Gammon
|
Message
| Speaking of obscure code:
http://www0.us.ioccc.org/main.html
There have been some very good entries in that over the years. For example, an adventure game where you got a whole lot of messages, none of which were visible in the source, at all (I think they were encoded as a variable number of spaces, or something very silly like that).
http://en.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest |
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| David Haley
USA (3,881 posts) Bio
|
Date
| Reply #11 on Thu 19 Aug 2010 04:16 AM (UTC) |
Message
|
Quote: What I did lets you use "", since it's inserted into the loadstring argument.
Hmm? Well, beyond the fact that I'm not sure how that's useful, how does the original version not allow that? When you say "", do you mean just doing:
> math <enter>
meaning to print out the empty string to the world?
or do you mean
> math ""<enter>
Nick: nice trick with the metatable. :-) |
David Haley aka Ksilyan
Head Programmer,
Legends of the Darkstone
http://david.the-haleys.org | Top |
|
Posted by
| Nick Gammon
Australia (23,133 posts) Bio
Forum Administrator |
Date
| Reply #12 on Thu 19 Aug 2010 04:45 AM (UTC) Amended on Thu 19 Aug 2010 05:27 AM (UTC) by Nick Gammon
|
Message
| Thanks David!
On the very original, if you do this:
math string.match ("nick", "i")
You get:
Compile error
World: SmaugFUSS
Immediate execution
[string "Alias: "]:1: unexpected symbol near '\'
And similar for the variants that don't use loadstring.
This is because MUSHclient notices the quotes and tries to fix them by putting \ in front of them, so the parser sees:
math string.match (\"nick\", \"i\")
It assumes that you would want to put %1 inside quotes, and therefore quotes inside %1 need to be escaped.
The loadstring works around this, because you *have* put %1 inside quotes.
Mind you, the original one is still the simplest by far. The only problems are that one (the quotes) and the fact that things like sqrt have to be math.sqrt.
|
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| Twisol
USA (2,257 posts) Bio
|
Date
| Reply #13 on Thu 19 Aug 2010 05:32 AM (UTC) Amended on Thu 19 Aug 2010 05:33 AM (UTC) by Twisol
|
Message
|
Nick Gammon said: You have a bracket in the wrong spot.
Whoops! I got a table for my result and didn't bother to check what it was, since I was using split() to test. |
'Soludra' on Achaea
Blog: http://jonathan.com/
GitHub: http://github.com/Twisol | Top |
|
Posted by
| WillFa
USA (525 posts) Bio
|
Date
| Reply #14 on Thu 19 Aug 2010 05:54 AM (UTC) |
Message
|
Nick Gammon said:
Thanks David!
On the very original, if you do this:
math string.match ("nick", "i")
You get:
Compile error
World: SmaugFUSS
Immediate execution
[string "Alias: "]:1: unexpected symbol near '\'
...
Why would you want to math a string.find? This is a quick calculator, not a replacement for /print() after all. | Top |
|
The dates and times for posts above are shown in Universal Co-ordinated Time (UTC).
To show them in your local time you can join the forum, and then set the 'time correction' field in your profile to the number of hours difference between your location and UTC time.
88,102 views.
This is page 1, subject is 3 pages long: 1 2
3
It is now over 60 days since the last post. This thread is closed.
Refresh page
top