Closed
Description
Affects: JuliaCall
>>> from juliacall import Main
>>> Main.seval("x = 1+1; println(x)")
2
>>> Main.seval("x = 1+1\n println(x)")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/x/.julia/packages/PythonCall/qTEA1/src/jlwrap/module.jl", line 25, in seval
return self._jl_callmethod($(pyjl_methodnum(pyjlmodule_seval)), expr)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
juliacall.JuliaError: Base.Meta.ParseError("extra token after end of expression")
Stacktrace:
[1] parse(str::String; raise::Bool, depwarn::Bool)
@ Base.Meta ./meta.jl:272
[2] parse
@ ./meta.jl:266 [inlined]
[3] pyjlmodule_seval(self::Module, expr::Py)
@ PythonCall ~/.julia/packages/PythonCall/qTEA1/src/jlwrap/module.jl:13
[4] _pyjl_callmethod(f::Any, self_::Ptr{PythonCall.C.PyObject}, args_::Ptr{PythonCall.C.PyObject}, nargs::Int64)
@ PythonCall ~/.julia/packages/PythonCall/qTEA1/src/jlwrap/base.jl:62
[5] _pyjl_callmethod(o::Ptr{PythonCall.C.PyObject}, args::Ptr{PythonCall.C.PyObject})
@ PythonCall.C ~/.julia/packages/PythonCall/qTEA1/src/cpython/jlwrap.jl:47
The issue here, I suspect, is that JuiliaCall uses a parsing method that accepts only a single top-level block. This is not ideal as Julia's eval ∘ Meta.parse
accepts any number top-level expressions. What makes this a bug, though, is how subtle the difference between a single top-level block and multiple top-level blocks is. Specifically a; b
is okay but a\nb
is not which is very bad.
Fixing this may also fix #379 which would allow us to revert #380