This commit is contained in:
Vitor Santos Costa 2019-03-27 16:31:31 +00:00
parent 78473ddd2c
commit c50367325e
3 changed files with 99 additions and 105 deletions

View File

@ -3,16 +3,16 @@
%% @brief support yap shell %% @brief support yap shell
%% %%
:- module(yapi, [ %% :- module(yapi, [
python_ouput/0, %% python_ouput/0,
show_answer/2, %% show_answer/2,
show_answer/3, %% show_answer/3,
yap_query/4, %% yap_query/4,
python_query/2, %% python_query/2,
python_query/3, %% python_query/3,
python_import/1, %% python_import/1,
yapi_query/2 %% yapi_query/2
]). %% ]).
%:- yap_flag(verbose, silent). %:- yap_flag(verbose, silent).

View File

@ -6,22 +6,22 @@
*/ */
%:- yap_flag(gc_trace,verbose). %:- yap_flag(gc_trace,verbose).
:- module( jupyter, %% :- module( jupyter,
[jupyter_query/3, %% [jupyter_query/3,
jupyter_query/4, %% jupyter_query/4,
op(100,fy,('$')), %% op(100,fy,('$')),
op(950,fy,:=), %% op(950,fy,:=),
op(950,yfx,:=), %% op(950,yfx,:=),
% op(950,fx,<-), %% % op(950,fx,<-),
% op(950,yfx,<-), %% % op(950,yfx,<-),
op(50, yf, []), %% op(50, yf, []),
op(50, yf, '()'), %% op(50, yf, '()'),
op(100, xfy, '.'), %% op(100, xfy, '.'),
op(100, fy, '.'), %% op(100, fy, '.'),
blank/1, %% blank/1,
streams/1 %% streams/1
] %% ]
). %% ).
:- use_module(library(hacks)). :- use_module(library(hacks)).
@ -37,15 +37,10 @@
:- python_import(sys). :- python_import(sys).
:- meta_predicate jupyter_query(+,:,+,-), jupyter_query(+,:,+). %:- meta_predicate jupyter_query(+,:,+,-), jupyter_query(+,:,+).
jupyter_query(Caller, Cell, Line, Bindings ) :- jupyter_query(Caller, Cell, Line, Bindings ) :-
gated_call( jupyter_cell(Caller, Cell, Line, Bindings).
streams(true),
jupyter_cell(Caller, Cell, Line, Bindings),
Port,
next_streams( Caller, Port, Bindings )
).
jupyter_query(Caller, Cell, Line ) :- jupyter_query(Caller, Cell, Line ) :-
jupyter_query( Caller, Cell, Line, _Bindings ). jupyter_query( Caller, Cell, Line, _Bindings ).
@ -58,8 +53,8 @@ next_streams( _Caller, answer, _Bindings ) :-
!. !.
next_streams(_, redo, _ ) :- next_streams(_, redo, _ ) :-
!. !.
next_streams( _, _, _ ) :- next_streams( _, _, _ ). % :-
streams(false). % streams(false).
@ -105,9 +100,8 @@ jupyter_consult(Cell) :-
load_files(user:Stream,[stream(Stream)| Options]) load_files(user:Stream,[stream(Stream)| Options])
), ),
error(A,B), error(A,B),
(close(Stream), system_error(A,B)) system_error(A,B)
), ),
close(Stream),
fail. fail.
jupyter_consult(_Cell). jupyter_consult(_Cell).

View File

@ -614,6 +614,13 @@ class YAPRun(InteractiveShell):
`result : :class:`ExecutionResult` `result : :class:`ExecutionResult`
""" """
if store_history:
# Write output to the database. Does nothing unless
# history output logging is enabled.
self.shell.history_manager.store_output(self.shell.execution_count)
# Each cell is a *single* input, regardless of how many lines it has
self.shell.execution_count += 1
# construct a query from a one-line string # construct a query from a one-line string
# q is opaque to Python # q is opaque to Python
# vs is the list of variables # vs is the list of variables
@ -649,8 +656,6 @@ class YAPRun(InteractiveShell):
# # Display the exception if input processing failed. # # Display the exception if input processing failed.
if preprocessing_exc_tuple is not None: if preprocessing_exc_tuple is not None:
self.showtraceback(preprocessing_exc_tuple) self.showtraceback(preprocessing_exc_tuple)
if store_history:
self.shell.execution_count += 1
return self.error_before_exec(preprocessing_exc_tuple[2]) return self.error_before_exec(preprocessing_exc_tuple[2])
# Our own compiler remembers the __future__ environment. If we want to # Our own compiler remembers the __future__ environment. If we want to
@ -695,7 +700,7 @@ class YAPRun(InteractiveShell):
# can fill in the output value. # can fill in the output value.
self.shell.displayhook.exec_result = result self.shell.displayhook.exec_result = result
(program,squery,_ ,howmany) = self.prolog_cell(cell) (program,squery,_ ,howmany) = self.prolog_cell(cell)
print(program, squery, howmany) print("program",program, "q", squery, "h",howmany)
if howmany <= 0 and not program: if howmany <= 0 and not program:
return result return result
if self.syntaxErrors(program+squery+".\n") : if self.syntaxErrors(program+squery+".\n") :
@ -741,13 +746,6 @@ class YAPRun(InteractiveShell):
if not silent: if not silent:
self.shell.events.trigger('post_run_cell') self.shell.events.trigger('post_run_cell')
if store_history:
# Write output to the database. Does nothing unless
# history output logging is enabled.
self.shell.history_manager.store_output(self.shell.execution_count)
# Each cell is a *single* input, regardless of how many lines it has
self.shell.execution_count += 1
self.engine.mgoal(streams(False),"user", True) self.engine.mgoal(streams(False),"user", True)
return return
@ -758,8 +756,8 @@ class YAPRun(InteractiveShell):
def pcell(s): def pcell(s):
""" """
Trasform a text into program+query. A query is the Trasform a text into program+query. A query is the
last line if the last line is non-empty and does not terminate last line if the last line is non-empty and does not terminate
on a dot. You can also finish with on a dot. You can also finish with
@ -768,64 +766,66 @@ def pcell(s):
If the line terminates on a `*/` or starts on a `%` we assume the line If the line terminates on a `*/` or starts on a `%` we assume the line
is a comment. is a comment.
""" """
try: try:
sl = s.splitlines() sl = s.splitlines()
l = len(sl) l = len(sl)
i = 0 i = 0
while i<l: while i<l:
line = sl[-i-1] line = sl[-i-1]
if line.strip() != '' and line[0] != '': if line.strip() != '' and line[0] != '':
break break
i+=1 i+=1
if i == l: if i == l:
return ('','','',0) return ('','','',0)
if line[-1] == '.': if line[-1] == '.':
return (s,'','.',0) return (s,'','.',0)
query = '' query = ''
loop = '' loop = ''
while i<l: while i<l:
line = sl[-i-1] line = sl[-i-1]
if line.strip() == '': if line.strip() == '':
break break
query = line+'\n\n'+query query = line+'\n'+query
i+=1 i+=1
reps = 1 reps = 1
if query: if query:
q = query.strip() q = query.strip()
c= q.rpartition('?') c= q.rpartition('?')
if not c[1]: if not c[1]:
c= q.rpartition(';') c= q.rpartition(';')
c2 = c[2].strip() c2 = c[2].strip()
if len(c[1]) == 1 and c[0].strip(): if len(c[1]) == 1 and c[0].strip():
c2 = c[2].strip() c2 = c[2].strip()
query = c[0] query = c[0]
if c2.isdecimal(): if c2.isdecimal():
reps = int(c2) reps = int(c2)
elif c2: elif c2:
return ('',c[1]+c[2],c[1],-1) return ('',c[1]+c[2],c[1],-1)
elif c[1] == '?': elif c[1] == '?':
reps = 1 reps = 1
else: else:
reps = 10000000000 reps = 10000000000
loop = c[1] loop = c[1]
while i<l: while i<l:
line = sl[-i-1] line = sl[-i-1]
if line.strip() != '': if line.strip() != '':
break break
i+=1 i+=1
program = '' program = ''
while i<l: while i<l:
line = sl[-i-1] line = sl[-i-1]
program = line+'\n\n'+program program = line+'\n'+program
i+=1 i+=1
return (program, query, loop, reps) return (program, query, loop, reps)
except Exception as e: except Exception as e:
try: try:
(etype, value, tb) = e (etype, value, tb) = e
traceback.print_exception(etype, value, tb) traceback.print_exception(etype, value, tb)
except: return ('','','',-1)
print(e) except:
print(e)
return ('','','',-1)