Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions SYMBOLS_MANIFEST.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1218,6 +1218,7 @@ System`SyntaxQ
System`Table
System`TableForm
System`TagBox
System`TagUnset
System`TagSet
System`TagSetDelayed
System`Take
Expand Down
1 change: 0 additions & 1 deletion admin-tools/check_benchmarks.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@

import argparse
import json
import os
import sys
from pathlib import Path

Expand Down
4 changes: 3 additions & 1 deletion admin-tools/normalize_benchmarks.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ def normalize_benchmarks(target_file):
break

if ref_bench is None:
print(f"⚠️ Benchmark for the reference task '{REFERENCE_NAME} not found'. Exit.")
print(
f"⚠️ Benchmark for the reference task '{NORMALIZATION_TASK_KEY} not found'. Exit."
)
sys.exit(1)

# Extract the reference value
Expand Down
77 changes: 77 additions & 0 deletions mathics/builtin/assignments/clear.py
Original file line number Diff line number Diff line change
Expand Up @@ -286,3 +286,80 @@ def eval_unset_makeboxes(self, expr, evaluation):
evaluation.message("Unset", "norep", expr, Symbol("System`MakeBoxes"))
return SymbolFailed
return SymbolNull


class TagUnset(PostfixOperator):
"""
<url>
:WMA link:
https://reference.wolfram.com/language/ref/TagUnset.html</url>

<dl>
<dt>'TagUnset'[$f$, $patt$]
<dt>'f/: $patt$=.'
<dd>removes any value belonging to the patter $patt$ from $f$.
</dl>



Let's consider we define an UpValue for a symbol g:
>> Sin[g[x_]]^:=Sing[x];
in a way that
>> Sin[g[3]]
= Sing[3]

TagUset allows to remove the rule:
>> g/: Sin[g[x_]]=.
>> Sin[g[3]]
= Sin[g[3]]
"""

attributes = A_HOLD_ALL | A_PROTECTED

messages = {
"norep": "Assignment on `2` for `1` not found.",
"sym": "Argument `1` at position 1 is expected to be a symbol.",
"tag": "Rule for `1` of `2` can only be attached to `3`.",
}
summary_text = "unset a value of the LHS, associated to a symbol."

def eval_general(self, tag, expr, evaluation):
"TagUnset[tag_, expr_]"

if not isinstance(tag, Symbol):
evaluation.message("TagSet", "sym", tag)
return SymbolNull
tag_name = tag.get_name()
head = expr.get_head()
if head in SYSTEM_SYMBOL_VALUES:
if len(expr.elements) != 1:
evaluation.message_args(expr.get_head_name(), len(expr.elements), 1)
return SymbolFailed
target_symbol = expr.elements[0]
if not target_symbol.sameQ(tag):
evaluation.message("TagUnset", "tag", target_symbol, expr, tag)
return SymbolFailed
symbol = target_symbol.get_name()
if not symbol:
evaluation.message(expr.get_head_name(), "fnsym", expr)
return SymbolFailed
if head is SymbolOptions:
empty = {}
else:
empty = []
evaluation.definitions.set_values(symbol, expr.get_head_name(), empty)
return SymbolNull

if not tag_name:
return SymbolNull
if not evaluation.definitions.unset(tag_name, expr):
evaluation.message("TagUnset", "norep", expr, tag)
return SymbolFailed
return SymbolNull

def eval_unset_makeboxes(self, tag, expr, evaluation):
"TagUnset[tag_, expr:MakeBoxes[_, _]]"
if not evaluation.definitions.unset_format(tag.get_name(), "_MakeBoxes", expr):
evaluation.message("Unset", "norep", expr, tag)
return SymbolFailed
return SymbolNull
2 changes: 1 addition & 1 deletion mathics/eval/options/values.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from mathics.core.parser import parse_builtin_rule
from mathics.core.symbols import SymbolList, strip_context
from mathics.core.symbols import strip_context


def filter_non_default_values(builtin):
Expand Down
2 changes: 1 addition & 1 deletion test/builtin/assumptions/test_assumptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ def test_assumptions_integrate(str_expr, str_expected, message):
LIST_TEST_ASSUMPTIONS_INTEGRATE_FAILING,
)
@pytest.mark.xfail(reason="the Assumptions with Integrate is not fully working")
def test_assumptions_integrate(str_expr, str_expected, message):
def test_assumptions_integrate2(str_expr, str_expected, message):
check_evaluation(str_expr, str_expected)


Expand Down
11 changes: 1 addition & 10 deletions test/core/convert/test_sympy.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,7 @@
Symbol_F = Symbol("Global`F")
Symbol_G = Symbol("Global`G")

from mathics.core.expression import Expression
from mathics.core.expression_predefined import MATHICS3_COMPLEX_INFINITY
from mathics.core.symbols import (
Symbol,
SymbolNull,
SymbolPlus,
SymbolPower,
SymbolTimes,
)
from mathics.core.systemsymbols import SymbolE, SymbolExp, SymbolI, SymbolPi, SymbolSin
from mathics.core.symbols import Symbol

Symbol_a = Symbol("Global`a")
Symbol_b = Symbol("Global`b")
Expand Down
3 changes: 0 additions & 3 deletions test/timings/test_regressions.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,9 +152,6 @@
param_ids = [name for name, _, _, _ in BENCHMARK_TASKS]


import pytest


@pytest.mark.skipif(
not os.environ.get("BENCHMARKS", 0), reason="benchmarks not required"
)
Expand Down
Loading