|
[Date Index]
[Thread Index]
[Author Index]
"matched" Set[]
- To: mathgroup at smc.vnet.net
- Subject: [mg91619] "matched" Set[]
- From: "厉正吉" <zhengji.li at gmail.com>
- Date: Fri, 29 Aug 2008 04:12:14 -0400 (EDT)
I have used Erlang (http://www.erlang.org) sometimes, and find its
assignment statement is *amazing*. As an example,
{ok, Value} = module:foo(..., ...).
If this function successfully done the operation, then it will return
{ok, Result}, then Result is assigned to Value; if not, it will return
something else, such as {badarg, wrong}. Now, "badarg" cannot be
assigned to (or more exactly, "does not match") "ok", and an
exception is raised at runtime. This is really COOL.
So, I want such feature in Mathematica too, and have written a Match
function attached at the end of this mail. With it, I can do things
like this:
Match[1234, V] = {1234, 4321}; ===> V = 4321.
Match[1234, V] = {4321, 4321}; ===> Throw::nocatch: .......
This "Match" is still not perfect yet: the result of expression
(Match[1234, V] = {1234, 4321}) is 4321, maybe {1234, 4321} is much
better, like what Set[] alway does.
I find such a "Match" is quite useful when writing a parser in
Mathematica from scratch.
====================== Souce code of Match ======================
Attributes[Match] = {HoldAll};
Match /: Set[Match[lhs_Symbol], rhs_] := (lhs = rhs);
Match /: Set[Match[lhs_], rhs_] :=
If[lhs === rhs, rhs,
Throw["mismatch: '" <> ToString[lhs] <> "'\[LongLeftRightArrow]'" <>
ToString[rhs] <> "'"]];
Match /: Set[Match[lhs_, lhs2_, padding__],
rhs_List] := (Match[lhs] = First@rhs;
Match[lhs2, padding] = Rest@rhs);
Match /: Set[
Match[lhs1_, lhs2_], {rhs1_, rhs2_}] := (Match[lhs1] = rhs1;
Match[lhs2] = rhs2);
--
Li Zhengji
Prev by Date:
Monitoring/collecting evaluations
Next by Date:
Help on Collecting Integers
Previous by thread:
Monitoring/collecting evaluations
Next by thread:
Help on Collecting Integers
|