Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tweak some error messages to be more like WMA... #1094

Merged
merged 5 commits into from
Sep 26, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
35 changes: 20 additions & 15 deletions mathics/builtin/list/eol.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from mathics.core.builtin import BinaryOperator, Builtin
from mathics.core.convert.expression import to_mathics_list
from mathics.core.convert.python import from_python
from mathics.core.evaluation import Evaluation
from mathics.core.exceptions import (
InvalidLevelspecError,
MessageException,
Expand Down Expand Up @@ -589,24 +590,24 @@ class First(Builtin):
>> First[a + b + c]
= a
>> First[x]
: Nonatomic expression expected.
: Nonatomic expression expected at position 1 in First[x].
= First[x]
>> First[{}]
: {} has zero length and no first element.
= First[{}]
"""

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

First and Lastshould have a default value as second arg and attribute A_HOLD_REST.

Copy link
Contributor

@mmatera mmatera Sep 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@axkr, you are right:

In[1]:= First[a]                                                                

First::normal: Nonatomic expression expected at position 1 in First[a].

Out[1]= First[a]

In[2]:= First[a, b]                                                             

Out[2]= b

In[3]:= First[a, b, c]                                                          

First::argt: First called with 3 arguments; 1 or 2 arguments are expected.

Out[3]= First[a, b, c]

In[4]:= ?? First                                                                

Out[4]= First[expr] gives the first element in expr
         
        >    . First[expr, def] gives the first element if it exists, or def

         
        >       otherwise.


        Attributes[First]={HoldRest, Protected}

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks - this should be handled now.

messages = {
"normal": "Nonatomic expression expected.",
"normal": "Nonatomic expression expected at position 1 in `1`.",
"nofirst": "`1` has zero length and no first element.",
}
summary_text = "first element of a list or expression"

def eval(self, expr, evaluation):
def eval(self, expr, evaluation: Evaluation, expression: Expression):
"First[expr_]"

if isinstance(expr, Atom):
evaluation.message("First", "normal")
evaluation.message("First", "normal", expression)
return
if len(expr.elements) == 0:
evaluation.message("First", "nofirst", expr)
Expand Down Expand Up @@ -820,24 +821,24 @@ class Last(Builtin):
>> Last[{a, b, c}]
= c
>> Last[x]
: Nonatomic expression expected.
: Nonatomic expression expected at position 1 in Last[x].
= Last[x]
>> Last[{}]
: {} has zero length and no last element.
= Last[{}]
"""

messages = {
"normal": "Nonatomic expression expected.",
"normal": "Nonatomic expression expected at position 1 in `1`.",
"nolast": "`1` has zero length and no last element.",
}
summary_text = "last element of a list or expression"

def eval(self, expr, evaluation):
def eval(self, expr, evaluation: Evaluation, expression: Expression):
"Last[expr_]"

if isinstance(expr, Atom):
evaluation.message("Last", "normal")
evaluation.message("Last", "normal", expression)
return
if len(expr.elements) == 0:
evaluation.message("Last", "nolast", expr)
Expand Down Expand Up @@ -906,17 +907,21 @@ class Most(Builtin):
>> Most[a + b + c]
= a + b
>> Most[x]
: Nonatomic expression expected.
: Nonatomic expression expected at position 1 in Most[x].
= Most[x]
"""

messages = {
"normal": "Nonatomic expression expected at position 1 in `1`.",
}

summary_text = "remove the last element"

def eval(self, expr, evaluation):
def eval(self, expr, evaluation: Evaluation, expression: Expression):
"Most[expr_]"

if isinstance(expr, Atom):
evaluation.message("Most", "normal")
evaluation.message("Most", "normal", expression)
return
return expr.slice(expr.head, slice(0, -1), evaluation)

Expand Down Expand Up @@ -1395,24 +1400,24 @@ class Rest(Builtin):
>> Rest[a + b + c]
= b + c
>> Rest[x]
: Nonatomic expression expected.
: Nonatomic expression expected at position 1 in Rest[x].
= Rest[x]
>> Rest[{}]
: Cannot take Rest of expression {} with length zero.
= Rest[{}]
"""

messages = {
"normal": "Nonatomic expression expected.",
"normal": "Nonatomic expression expected at position 1 in `1`.",
"norest": "Cannot take Rest of expression `1` with length zero.",
}
summary_text = "remove the first element"

def eval(self, expr, evaluation):
def eval(self, expr, evaluation: Evaluation, expression: Expression):
"Rest[expr_]"

if isinstance(expr, Atom):
evaluation.message("Rest", "normal")
evaluation.message("Rest", "normal", expression)
return
if len(expr.elements) == 0:
evaluation.message("Rest", "norest", expr)
Expand Down
2 changes: 1 addition & 1 deletion mathics/eval/files_io/files.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ def eval_Get(path: str, evaluation: Evaluation, trace_fn: Optional[Callable]):
continue
result = query.evaluate(evaluation)
except IOError:
evaluation.message("General", "noopen", path)
evaluation.message("Get", "noopen", path)
return SymbolFailed
except MessageException as e:
e.message(evaluation)
Expand Down