expreduce icon indicating copy to clipboard operation
expreduce copied to clipboard

Interpreter in interactive mode: do not attempt to evaluate expression while parser says EOF

Open darvin opened this issue 7 years ago • 8 comments
trafficstars

In[1]:= Plus[2,

Syntax::sntx: nofile:1:8: unexpected EOF, expected expression or one of ['!', '(', '+', '-', '?', ']', '{', '}', ++, --, ;;, <<, \@, \[Del], \[Integrate], \[MinusPlus], \[PlusMinus], \[Sqrt], \[Square], ]], identifier, integer, out, pattern, real, slot, string].

Desired behavior:

In[1]:= Plus[2,                                                                 
                                                                                
                                                                                
        2                                                                       
        ]                                                                       

Out[1]= 4

darvin avatar Jun 03 '18 08:06 darvin

once this implemented, https://github.com/corywalker/expreduce/pull/150 probably should be reverted, because it reads in whole script completely which is aint right.

I believe we should keep eventually one code path for both interactive and batch mode:

  • One code path is nice and more maintainable
  • There should be possibility to read script files piped in, or very large script files

darvin avatar Jun 03 '18 08:06 darvin

I think this is a regression. Could you please try to bisect?

cznic avatar Jun 03 '18 08:06 cznic

@cznic https://github.com/corywalker/expreduce/commit/1c23eed951f301b7be729803329b7189eb268f3b

in expreduce.go

	for {
		rl.SetPrompt(fmt.Sprintf("In[%d]:= ", promptNum))
		line, err := rl.Readline()
		if err != nil { // io.EOF, readline.ErrInterrupt
			break
		}
		if line == "" {
			continue
		}
		fmt.Printf("\n")

line if err != nil { // io.EOF, readline.ErrInterrupt

darvin avatar Jun 03 '18 08:06 darvin

i think

darvin avatar Jun 03 '18 08:06 darvin

Revision https://github.com/corywalker/expreduce/commit/1c23eed951f301b7be729803329b7189eb268f3b precedes using the external parser that handles newlines differently for interactive input.

jnml@4670:~/src/github.com/cznic/wl> go run demo.go 
Enter WL expression(s). Newlines will be ignored in places where the input is not valid.
Closing the input exits the program.
In[1]:= Plus[2,

2
]
&wl.Expression{
· Case: ExpressionCase(133),
· ExprList: &wl.ExprList{
· · ExprList: &wl.ExprList{
· · · Case: 1,
· · · Expression: &wl.Expression{
· · · · Case: ExpressionInteger,
· · · · Token: INT, "2",
· · · },
· · · Token: ',',
· · },
· · Expression: &wl.Expression{
· · · Case: ExpressionInteger,
· · · Token: INT, "2",
· · },
· },
· Expression: &wl.Expression{
· · Case: ExpressionIdent,
· · Token: IDENT, "Plus",
· },
· Token: '[',
· Token2: ']',
}
In[2]:= 

cznic avatar Jun 03 '18 08:06 cznic

huh it seem to be working at the time of filing this one https://github.com/corywalker/expreduce/issues/80

darvin avatar Jun 03 '18 09:06 darvin

I don't remember multi-line input ever working for the console frontend. It works very well for importing files through the "<<" operator, which is very important for loading normal source files. I did not prioritize highly multi-line support for the console frontend, which I think explains this bug.

corywalker avatar Jun 03 '18 19:06 corywalker

I've probably created a false memory of it based on the demo program seen above. However, I think it should be easy to make multi line input work in the terminal. Just keep writing the readllines to the wl.Input until the parser accepts or rejects the input. Then run the interpreter using the resulting AST.

But I don't know enough about the internals of this project to be sure it's that simple.

cznic avatar Jun 03 '18 19:06 cznic