diff --git a/SYMBOLS_MANIFEST.txt b/SYMBOLS_MANIFEST.txt index 7bab8ea8b..370cd33b8 100644 --- a/SYMBOLS_MANIFEST.txt +++ b/SYMBOLS_MANIFEST.txt @@ -1023,6 +1023,7 @@ System`Refine System`RegularExpression System`RegularPolygon System`RegularPolygonBox +System`Release System`ReleaseHold System`Remove System`RemoveDiacritics diff --git a/mathics/builtin/evaluation.py b/mathics/builtin/evaluation.py index f4ea135c8..8c469fa93 100644 --- a/mathics/builtin/evaluation.py +++ b/mathics/builtin/evaluation.py @@ -213,6 +213,33 @@ class Evaluate(Builtin): summary_text = "evaluate the element, disregarding Hold attributes" +class Release(Builtin): + """ + :WMA link:https://reference.wolfram.com/language/ref/Release.html + +
+
'Release'[$expr$] +
evaluates $expr$. This is an obsolete symbol, superseded by \ + 'Evaluate' and 'ReleaseHold'; it is kept so that old packages \ + can be read. +
+ + >> x = 1 + 1; Release[x] + = 2 + + Old packages use it to build the left-hand side of a definition from \ + a variable: + >> With[{name = h}, Format[Release[name][k_]] := {name, k}]; ToString[h[3]] + = {h, 3} + #> Clear[x, h] + """ + + rules = { + "Release[x___]": "x", + } + summary_text = "obsolete form of Evaluate" + + class Unevaluated(Builtin): """ :WMA link:https://reference.wolfram.com/language/ref/Unevaluated.html diff --git a/test/builtin/test_evaluation.py b/test/builtin/test_evaluation.py index 1d635991d..a73717c5d 100644 --- a/test/builtin/test_evaluation.py +++ b/test/builtin/test_evaluation.py @@ -62,6 +62,15 @@ None, ), ("ClearAll[f];", None, None, None), + # Release, the obsolete form of Evaluate + ("x = 1 + 1; Release[x]", None, "2", None), + ( + "With[{name = h}, f[Release[name][k_]] := {name, k}]; f[h[3]]", + None, + "{h, 3}", + "Release in the left-hand side of a definition", + ), + ("ClearAll[f, h, x];", None, None, None), ], ) def test_evaluation(str_expr, msgs, str_expected, fail_msg):