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
14 changes: 14 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ New Builtins

* ``$SessionID``
* ``BinaryReadList``
* ``Hypergeometric2F1``

Internals
---------
Expand All @@ -17,6 +18,19 @@ Mathics scanner exceptions of class TranslateError are incompatible
with previous versions, and now store error parameters, "name", "tag", and
"args".

WMA Compatibility
-----------------

Hypergeometric functions have been revised to conform better to WMA behavior by
expanding hypergeometric results.

Bugs
----

* Fixed #1187



8.0.1
-----

Expand Down
35 changes: 15 additions & 20 deletions mathics/builtin/files_io/files.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
read_name_and_stream,
)
from mathics.eval.makeboxes import do_format, format_element
from mathics.eval.stackframe import get_eval_Expression


class Input_(Predefined):
Expand Down Expand Up @@ -567,7 +568,7 @@ class Put(InfixOperator):

summary_text = "write an expression to a file"

def eval(self, exprs, filename, evaluation):
def eval(self, exprs, filename, evaluation: Evaluation):
"Put[exprs___, filename_String]"
instream = to_expression("OpenWrite", filename).evaluate(evaluation)
if len(instream.elements) == 2:
Expand All @@ -581,7 +582,7 @@ def eval(self, exprs, filename, evaluation):
close_stream(py_instream, instream_number)
return result

def eval_input(self, exprs, name, n, evaluation):
def eval_input(self, exprs, name, n, evaluation: Evaluation):
"Put[exprs___, OutputStream[name_, n_]]"
stream = stream_manager.lookup_stream(n.get_int_value())

Expand All @@ -608,11 +609,10 @@ def do_format_output(expr, evaluation):

return SymbolNull

def eval_default(self, exprs, filename, evaluation):
def eval_default(self, exprs, filename, evaluation: Evaluation):
"Put[exprs___, filename_]"
expr = to_expression("Put", exprs, filename)
evaluation.message("Put", "stream", filename)
return expr
return to_expression("Put", exprs, filename)


class PutAppend(InfixOperator):
Expand Down Expand Up @@ -661,7 +661,7 @@ class PutAppend(InfixOperator):

summary_text = "append an expression to a file"

def eval(self, exprs, filename, evaluation):
def eval(self, exprs, filename: String, evaluation):
"PutAppend[exprs___, filename_String]"
instream = to_expression("OpenAppend", filename).evaluate(evaluation)
if len(instream.elements) == 2:
Expand All @@ -672,12 +672,12 @@ def eval(self, exprs, filename, evaluation):
to_expression("Close", instream).evaluate(evaluation)
return result

def eval_input(self, exprs, name, n, evaluation):
def eval_input(self, exprs, name, n, evaluation: Evaluation):
"PutAppend[exprs___, OutputStream[name_, n_]]"
stream = stream_manager.lookup_stream(n.get_int_value())

if stream is None or stream.io.closed:
evaluation.message("Put", "openx", to_expression("OutputSteam", name, n))
evaluation.message("Put", "openx", get_eval_Expression())
return

text = [
Expand All @@ -691,11 +691,10 @@ def eval_input(self, exprs, name, n, evaluation):

return SymbolNull

def eval_default(self, exprs, filename, evaluation):
def eval_default(self, exprs, filename, evaluation: Evaluation):
"PutAppend[exprs___, filename_]"
expr = to_expression("PutAppend", exprs, filename)
evaluation.message("PutAppend", "stream", filename)
return expr
return get_eval_Expression()


def validate_read_type(name: str, typ, evaluation: Evaluation):
Expand Down Expand Up @@ -1100,11 +1099,9 @@ def eval_n(self, file, types, n: Integer, evaluation: Evaluation, options: dict)
# token_words = py_options['TokenWords']
# word_separators = py_options['WordSeparators']

py_n = n.get_int_value()
py_n = n.value
if py_n < 0:
evaluation.message(
"ReadList", "intnm", to_expression("ReadList", file, types, n)
)
evaluation.message("ReadList", "intnm", get_eval_Expression())
return

result = []
Expand Down Expand Up @@ -1215,9 +1212,7 @@ def eval_input(self, name, n, m, evaluation):

seekpos = m.to_python()
if not (isinstance(seekpos, int) or seekpos == float("inf")):
evaluation.message(
"SetStreamPosition", "stmrng", to_expression("InputStream", name, n), m
)
evaluation.message("SetStreamPosition", "stmrng", get_eval_Expression(), m)
return

try:
Expand Down Expand Up @@ -1312,7 +1307,7 @@ def eval(self, name, n, typ, m, evaluation: Evaluation, options: dict):
evaluation.message(
"Skip",
"intm",
to_expression("Skip", to_expression("InputStream", name, n), typ, m),
to_expression("Skip", stream, typ, m),
)
return
for i in range(py_m):
Expand Down Expand Up @@ -1478,7 +1473,7 @@ def eval(self, evaluation):
"Streams[]"
return self.eval_name(None, evaluation)

def eval_name(self, name, evaluation):
def eval_name(self, name: String, evaluation):
"Streams[name_String]"
result = []
for stream in stream_manager.STREAMS.values():
Expand Down
1 change: 1 addition & 0 deletions mathics/builtin/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ class General(Builtin):
"fnsym": (
"First argument in `1` is not a symbol " "or a string naming a symbol."
),
"hdiv": "`1` does not exist. Arguments are not consistent.",
"heads": "Heads `1` and `2` are expected to be the same.",
"ilsnn": (
"Single or list of non-negative integers expected at " "position `1`."
Expand Down
Loading
Loading