# How to verbalise code in Mathematica?

How do you read an expression like?

x + y /. x -> 2


Looking up /. and -> in Mathematica docs it says ReplaceAll and Rule. But you would not pronounce the expression above as

x plus y replace all x rule 2.


Instead you would say something like

x plus y where x goes to two.


The operators /. and -> are just two examples, there are a lot of others in Mathematica. Is there some resource that addresses pronunciations in Mathematica.

• @C.E Of course there must be several ways to pronounce an expression, depending on the context. I am not after one true way to pronounce, but more a list of examples how you could pronounce some not obvious expressions. Maybe no one thinks this is worthwhile and that's OK, but if anybody has discussed this I would like a link to it. Commented Apr 27, 2019 at 9:14
• How about you get a list started, like the Haskell example, and everybody chips in? Something like a table with three columns: "symbol", "pronounciations" (many lines), and "voters" where everybody can put in their name to vote for a particular pronounciation. Commented Apr 27, 2019 at 10:13
• Interesting question. I am not in the habit of reading out code this way. I think in this case I would say: "in x plus y, replace all x with two" – does that seem intelligible to you? Commented Apr 27, 2019 at 10:44
• Clearly, the 'right' way to say it is Speak@HoldForm[x + y /. x -> 2]. I find it interesting that Speak translates -> well but has no understanding of what /. is. Commented Apr 27, 2019 at 11:15
• Why is this question closed? There are already two good answers! Commented Jul 1, 2019 at 17:13

Starting a brain dump of ideas, listening to my inner monologue. Please feel free to edit and add suggestions. Here is a list of most operators.

| sym  | example     | pronunciation                       | votes, comments, rants
|––––––|–––––––––––––|–––––––––––––––––––––––––––––––––––––|–––––––––––––––––––––––––
| ::   | x::y        | x says y                            |
| #    | #           | slot                                |
|      | #3          | slot 3                              |
| ##   | ##          | all slots                           |
|      | ##3         | all slots from third                |
| &    | x&          | x done                              |
|      |             | x end-of-function                   |
| %    | %           | above                               |
|      |             | previous                            |
| :    | x:_         | x-pattern                           |
|      |             | anything, call it x                 |
| /;   | x_/;y       | x-pattern that y                    |
|      |             | anything that y, call it x          |
| ?    | x_?yQ       | x-pattern that is y                 |
|      |             | anything y, call it x               |
| _    | x_          | x-pattern                           |
|      |             | anything, call it x                 |
| _    | x_y         | x-pattern of type y                 |
|      |             | anything of type y, call it x       |
| __   | x__         | x-patterns                          |
|      |             | any sequence, call it x             |
| ___  | x___        | x-maybepatterns                     |
|      |             | any sequence, even empty, call it x |
| _.   | x_.         | x-defaultpattern                    |
|      |             | anything, call it x, with default   |
| :    | x_:y        | x-pattern defaults to y             |
|      |             | anything, call it x, with default y |
| ..   | x..         | one or more x                       |
|      |             | x-more                              |
| ...  | x...        | zero or more x                      |
|      |             | x-maybemore                         |
| {}   | {1,2,3}     | list of 1, 2, 3                     |
| [[]] | x[[i]]      | element i of x                      |
| ;;   | x;;y;;z     | from x to y in steps of z           |
| ==   | x==y        | x equal to y                        |
| !=   | x!=y        | x not equal to y                    |
| ===  | x===y       | x same as y                         |
| =!=  | x=!=y       | x not same as y                     |
| ++   | x++         | x and then increment it             |
|      |             | x-before-increment                  |
| ++   | ++x         | x but increment it first            |
|      |             | x-after-increment                   |
| --   | x--         | x and then decrement it             |
|      |             | x-before-decrement                  |
| --   | --x         | x but decrement it first            |
|      |             | x-after-decrement                   |
| []   | f[x]        | f of x                              |
|      | f[x,y]      | f of x and y                        |
| @*   | x@*y        | y then x (read from right to left)  |
|      |             | x of y                              |
| //   | x//y        | x then y                            |
| /*   | x/*y        | x then y                            |
| @    | f@x         | f of x                              |
| ~    | x~f~y       | f of x and y                        |
|      |             | x with/using f on y                 |
| /@   | f/@x        | f mapped on x                       |
|      |             | f of all in x                       |
| //@  | f//@x       | f map-alled on x                    |
|      |             | f of everything in x                |
|      |             | f mapped on everything in x         |
| @@   | f@@x        | f-head on x                         |
|      |             | f applied to x                      |
| @@@  | f@@@x       | f-head mapped on x                  |
|      |             | f applied to all in x               |
| ->   | x->y        | x becomes y                         |
|      |             | x goes to y                         |
| :>   | x:>y        | x will become y                     |
|      |             | x will go to y                      |
| /.   | x/.y        | x where y                           |
| //.  | x//.y       | x where repeatedly y                |
| =    | x=y         | x is y                              |
| :=   | x:=y        | x will be y                         |
| ^=   | x[y]^=z     | y remembers x[y] is z               |
| ^:=  | x[y]^:=z    | y remembers x[y] will be z          |
| /:   | x/:y=z      | x remembers y is z                  |
| /:   | x/:y:=z     | x remembers y will be z             |
| .    | x=.         | x is cleared                        |
|––––––|–––––––––––––|–––––––––––––––––––––––––––––––––––––|–––––––––––––––––––

• thank you for a nice beginning. I often pronounce x_ as "anything, call it x". I guess you could pronounce x__ as "any sequence, call it x". And maybe you could pronounce x___ as "any sequence including empty, call it x". Commented Apr 27, 2019 at 16:52
• As I spend a fair amount of time teaching Mathematica to students who have never done programming, having a list of terms to use for the language's typography - if only to be self-consistent - is very helpful. Commented Apr 27, 2019 at 17:25
• @bobthechemist please feel free to add the way you would pronounce things to the list! I teach Mathematica too and would be keen to have a consistent list. Commented Apr 27, 2019 at 18:34
• Do you have _h in your table? It represents any expression having the h as its head. For instance f[x_Integer] :=... defines a function that takes any integer as a parameter. I would pronounce x_Integer as "any integer call it x". Commented Apr 27, 2019 at 19:39
• Yes @BobUeland I had extrapolated your earlier comment to include x_y as "anything of type y, call it x". Commented Apr 27, 2019 at 21:37

You could try using SpokenString:

SpokenString[HoldForm[x + y /. x->2]]


"x plus y slash dot x goes to 2"

If you don't mind messing with internal functions, it is possible to customize the output of SpokenString. For this purpose, it is convenient to make use of my ExtractDownValues function reproduced below:

SetAttributes[ExtractDownValues, HoldAll]

ExtractDownValues[sym_[args__]] := ExtractDownValues[sym,args]
ExtractDownValues[sym_,args__] := Cases[
DownValues[sym],_[h_,_] /; MatchQ[Unevaluated[sym[args]],h]
]


The internal function that does most of the heavy lifting is SpokenStringDumpSSText:

TracePrint[SpokenString[HoldForm[x + y /. x -> 2]], _SpokenStringDumpSSText]


SpokenStringDumpSSText[x+y/. x->2]

SpokenStringDumpSSText[x+y]

SpokenStringDumpSSText[x]

SpokenStringDumpSSText[y]

SpokenStringDumpSSText[2]

SpokenStringDumpSSText[x->2]

SpokenStringDumpSSText[x]

SpokenStringDumpSSText[2]

"x plus y slash dot x goes to 2"

Using ExtractDownValues we find:

ExtractDownValues @ SpokenStringDumpSSText[x + y /. x -> 2]


{HoldPattern[ SpokenStringDumpSSText[SpokenStringDumpa_ /. SpokenStringDumpb_]] :> SpokenStringDumpSpeakQuantity[SpokenStringDumpa, ReplaceAll, True] ~~ " slash dot " ~~ If[ListQ[Unevaluated[SpokenStringDumpb]], SpokenStringDumpSpeakListContents[SpokenStringDumpb], SpokenStringDumpSpeakQuantity[SpokenStringDumpb, ReplaceAll, True]], HoldPattern[ SpokenStringDumpSSText[SpokenStringDumpf_[SpokenStringDumpa___]]] :> Module[{SpokenStringDumpans = SpokenStringDumpSSText0[SpokenStringDumpf[SpokenStringDumpa]]}, If[Head[SpokenStringDumpans] =!= SpokenStringDumpSSText0 && ! MemberQ[SpokenStringDumpans, \$Failed, {0, 1}], SpokenStringDumpans, SpokenStringDumpSSTextFallThrough[ Unevaluated[SpokenStringDumpf[SpokenStringDumpa]]]]]}

Notice the " slash dot " string. So, modifying this downvalue to:

SpokenStringDumpSSText[a_ /.  b_] := SpokenStringDumpSpeakQuantity[a,ReplaceAll,True] ~~
" where " ~~
If[ListQ[Unevaluated[b]],
SpokenStringDumpSpeakListContents[b],
SpokenStringDumpSpeakQuantity[b,ReplaceAll,True]
]


will produce:

SpokenString[HoldForm[x + y /. x->2]]
`

"x plus y where x goes to 2"