17
$\begingroup$

My current understanding about Mathematica is that everything, at the lowest level, ends up as replacement rules.
First question: is this true?
Second question: does Mathematica "gloss over" these rules by representing them as functions? doesn't seem to be expressed as a rule.

Third question: does the by value/by reference question have any when you "pass" a value to a Mathematica function?

$\endgroup$
11
  • 6
    $\begingroup$ Well, obviously a system based on rules only, would only be able to do endless expression rewritings, but not much more. Even if one can build such a model of computation consistently, this is not what we see in Mathematica. From the user's viewpoint, (many) built-in functions are terminals, because their actions are no longer governed by rules. For example, when Mathematica sees Sin[0.15], it calls the built-in numerical implementation of Sin to make a computation - at which point it arguably leaves the rule-based paradigm. And similarly for most other useful lower-level actions. $\endgroup$ Commented Oct 22, 2013 at 1:56
  • 6
    $\begingroup$ I was tempted to edit your title: "Do rules rule?" But my nose is still bleeding as a result of a limerick. $\endgroup$ Commented Oct 22, 2013 at 2:19
  • 3
    $\begingroup$ Have a look at DownValues[f] that's where the rules are hiding in this case $\endgroup$
    – ssch
    Commented Oct 22, 2013 at 2:25
  • 2
    $\begingroup$ @GeorgeWolfe Your simple function is a rule. The only top-level (user-defined) functions in Mathematica which are not rules, AFAIK, are pure functions (defined using Function). $\endgroup$ Commented Oct 22, 2013 at 2:56
  • 2
    $\begingroup$ @GeorgeWolfe But generally, rules seem to be the core paradigm of the Mathematica language - more fundamental than functional or structural or procedural ones. Roman Maeder directly admits this in his "Programming in Mathematica". $\endgroup$ Commented Oct 22, 2013 at 3:00

1 Answer 1

8
$\begingroup$

When you define a function f, you are (a) applying Set or SetDelayed to a pattern, (b) creating a rule, (c) associating the rule with a symbol (f), and (d) storing that in DownValues (usually).

FullForm[Hold[f[x_] := x^2]]
(* Hold[SetDelayed[f[Pattern[x, Blank[]]], Power[x, 2]]] *)

f[x_] := x^2
DownValues@f
(* {HoldPattern[f[x_]] :> x^2} *)

First question: is it true that "everything in Mathematica is ultimately stored as a rule?"

No: for example 2 is not a rule. It's just 2. So not everything is a rule, just functions. Everything is an expression, ... some expressions (as a side-effect) create and store rules in DownValues.

Second question: does Mathematica "gloss over" these rules by representing them as functions?

Yes and no. They give you a glossy shortcut for input:

f[x_] := x^2

instead of requiring you to write something like

AppendTo[DownValues[f], HoldPattern[f[x_]] :> x^2]

There was one misunderstanding in your question; you asked about the output of

FullForm[f[x]]

This is not showing you the definition of the function f. It is showing you the result of applying f to x. See the following:

FullForm[f[2]]
(* 4 *)

If you want to see the definition of f you should either use Information (which is glossy and not very useful) or DownValues which contains what you're after.

Third question: does the by value/by reference question have any when you "pass" a value to a Mathematica function?

Work on the assumption that Mathematica is pretty smart "under the hood" about pass by value/ pass by reference.

$\endgroup$
1
  • 1
    $\begingroup$ Also comments (* ... *) and Mathematica packages are not stored as rules. They are not even expressions. $\endgroup$ Commented Mar 4, 2015 at 4:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.