From 10331cd262f58f442bef8d3db981cb36b4d98c3c Mon Sep 17 00:00:00 2001 From: Stanislav Date: Fri, 16 Oct 2026 02:33:03 +0400 Subject: [PATCH] Add Release, the obsolete form of Evaluate Release was superseded by Evaluate and ReleaseHold in Version 2.0, but WMA still knows it, and old packages use it, for instance to build the left-hand side of a definition from a variable: Format[Release[name][k_]] := Subscript[name, k]. Here it simply evaluates to its argument. Co-Authored-By: Claude Opus 5.5 --- SYMBOLS_MANIFEST.txt | 1 + mathics/builtin/evaluation.py | 27 +++++++++++++++++++++++++++ test/builtin/test_evaluation.py | 9 +++++++++ 3 files changed, 37 insertions(+) diff --git a/SYMBOLS_MANIFEST.txt b/SYMBOLS_MANIFEST.txt index 7bab8ea8b6..370cd33b8a 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 f4ea135c82..8c469fa93c 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 1d635991d8..a73717c5d0 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):