1
1
package main
2
2
3
3
import (
4
- "bufio"
5
4
"flag"
6
5
"fmt"
6
+ "github.com/chzyer/readline"
7
7
"github.com/yuin/gopher-lua"
8
8
"github.com/yuin/gopher-lua/parse"
9
9
"os"
@@ -122,9 +122,13 @@ Available options are:
122
122
123
123
// do read/eval/print/loop
124
124
func doREPL (L * lua.LState ) {
125
- reader := bufio .NewReader (os .Stdin )
125
+ rl , err := readline .New ("> " )
126
+ if err != nil {
127
+ panic (err )
128
+ }
129
+ defer rl .Close ()
126
130
for {
127
- if str , err := loadline (reader , L ); err == nil {
131
+ if str , err := loadline (rl , L ); err == nil {
128
132
if err := L .DoString (str ); err != nil {
129
133
fmt .Println (err )
130
134
}
@@ -144,28 +148,28 @@ func incomplete(err error) bool {
144
148
return false
145
149
}
146
150
147
- func loadline (reader * bufio. Reader , L * lua.LState ) (string , error ) {
148
- fmt . Print ("> " )
149
- if line , err := reader . ReadString ( '\n' ); err == nil {
151
+ func loadline (rl * readline. Instance , L * lua.LState ) (string , error ) {
152
+ rl . SetPrompt ("> " )
153
+ if line , err := rl . Readline ( ); err == nil {
150
154
if _ , err := L .LoadString ("return " + line ); err == nil { // try add return <...> then compile
151
155
return line , nil
152
156
} else {
153
- return multiline (line , reader , L )
157
+ return multiline (line , rl , L )
154
158
}
155
159
} else {
156
160
return "" , err
157
161
}
158
162
}
159
163
160
- func multiline (ml string , reader * bufio. Reader , L * lua.LState ) (string , error ) {
164
+ func multiline (ml string , rl * readline. Instance , L * lua.LState ) (string , error ) {
161
165
for {
162
166
if _ , err := L .LoadString (ml ); err == nil { // try compile
163
167
return ml , nil
164
168
} else if ! incomplete (err ) { // syntax error , but not EOF
165
169
return ml , nil
166
170
} else {
167
- fmt . Print (">> " )
168
- if line , err := reader . ReadString ( '\n' ); err == nil {
171
+ rl . SetPrompt (">> " )
172
+ if line , err := rl . Readline ( ); err == nil {
169
173
ml = ml + "\n " + line
170
174
} else {
171
175
return "" , err
0 commit comments