Wolfram Function Repository
Instant-use add-on functions for the Wolfram Language
Function Repository Resource:
Highlight the changes between two expressions
ResourceFunction["ExpressionLineDiff"][expr1,expr2] highlights changes between expr1 and expr2. |
| "TrimmingThreshold" | 2 | the maximum number of consecutive unchanged lines to display |
| "IndentSize" | 1 | the number of spaces to use per indentation level |
| "PageWidth" | 100 | the desired formatting width of the output |
| PerformanceGoal | "Quality" | control the level of detail in the highlighting |
| "MergeThreshold" | 2 | minimum length of consecutive unchanged characters required to merge into surrounding changes |
Highlight the differences between two expressions on a per-line basis:
| In[1]:= | ![]() |
| In[2]:= |
| Out[2]= | ![]() |
Check larger expressions:
| In[3]:= |
| In[4]:= |
| Out[4]= | ![]() |
Control the maximum number of consecutive unchanged lines to display:
| In[5]:= |
| In[6]:= |
| Out[6]= | ![]() |
Show all lines:
| In[7]:= |
| Out[7]= | ![]() |
Adjust the amount of indentation:
| In[8]:= |
| In[9]:= |
| Out[9]= | ![]() |
Reducing the page width will increase the number of lines:
| In[10]:= |
| In[11]:= |
| Out[11]= | ![]() |
Conversely, a larger page width will decrease the number of lines:
| In[12]:= |
| Out[12]= | ![]() |
By default, ExpressionLineDiff will use darker colors to highlight per-character changes:
| In[13]:= |
| In[14]:= |
| Out[14]= | ![]() |
With the option setting PerformanceGoal→"Speed", only per-line highlighting will be used:
| In[15]:= |
| Out[15]= | ![]() |
Control how many unchanged characters get merged into surrounding changes:
| In[16]:= |
| In[17]:= |
| Out[17]= |
| In[18]:= |
| Out[18]= |
A merge threshold of zero highlights exact changes:
| In[19]:= |
| Out[19]= |
Quickly find why two expressions that otherwise appear identical are different:
| In[20]:= |
| Out[20]= | ![]() |
| In[21]:= |
| Out[21]= | ![]() |
These are not in fact SameQ:
| In[22]:= |
| Out[22]= |
The difference is due to underlying Dynamic elements that use different local variables:
| In[23]:= |
| Out[23]= | ![]() |
ExpressionLineDiff compares InputForm strings, so highlighting does not necessarily align with subexpressions:
| In[24]:= |
| In[25]:= |
| Out[25]= |
This is comparable to using SequenceAlignment on the string representations:
| In[26]:= |
| Out[26]= |
| In[27]:= |
| Out[27]= |
For flat lists, SequenceAlignment can identify changes per element:
| In[28]:= |
| Out[28]= |
| In[29]:= |
| Out[29]= |
With the option setting PerformanceGoal→"Speed", ExpressionLineDiff only looks for changes on a per-line basis and does not highlight detailed changes:
| In[30]:= |
| In[31]:= |
| Out[31]= |
Using a smaller page width can increase the accuracy of highlighting at the cost of readability:
| In[32]:= |
| Out[32]= | ![]() |
For small expressions, it's better to use the default option setting PerformanceGoal→"Quality" to add additional per-character highlighting:
| In[33]:= |
| Out[33]= |
This work is licensed under a Creative Commons Attribution 4.0 International License