Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
deno
提交
e9327be8
D
deno
项目概览
张重言
/
deno
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
deno
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e9327be8
编写于
11月 06, 2018
作者:
A
Andy Hayden
提交者:
Ryan Dahl
11月 06, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Support repl multiline input (#1165)
上级
13e1eb2b
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
63 addition
and
18 deletion
+63
-18
js/repl.ts
js/repl.ts
+57
-18
tools/repl_test.py
tools/repl_test.py
+6
-0
未找到文件。
js/repl.ts
浏览文件 @
e9327be8
...
...
@@ -51,15 +51,12 @@ export function replLoop(): void {
window
.
deno
=
deno
;
// FIXME use a new scope (rather than window).
const
historyFile
=
"
deno_history.txt
"
;
const
prompt
=
"
>
"
;
const
rid
=
startRepl
(
historyFile
);
let
lin
e
=
""
;
let
cod
e
=
""
;
while
(
true
)
{
try
{
line
=
readline
(
rid
,
prompt
);
line
=
line
.
trim
();
code
=
readBlock
(
rid
,
"
>
"
,
"
"
);
}
catch
(
err
)
{
if
(
err
.
message
===
"
EOF
"
)
{
break
;
...
...
@@ -67,23 +64,65 @@ export function replLoop(): void {
console
.
error
(
err
);
exit
(
1
);
}
if
(
!
lin
e
)
{
if
(
!
cod
e
)
{
continue
;
}
if
(
line
===
"
.exit
"
)
{
}
else
if
(
code
.
trim
()
===
"
.exit
"
)
{
break
;
}
try
{
const
result
=
eval
.
call
(
window
,
line
);
// FIXME use a new scope.
console
.
log
(
result
);
}
catch
(
err
)
{
if
(
err
instanceof
Error
)
{
console
.
error
(
`
${
err
.
constructor
.
name
}
:
${
err
.
message
}
`
);
}
else
{
console
.
error
(
"
Thrown:
"
,
err
);
}
}
evaluate
(
code
);
}
close
(
rid
);
}
function
evaluate
(
code
:
string
):
void
{
try
{
const
result
=
eval
.
call
(
window
,
code
);
// FIXME use a new scope.
console
.
log
(
result
);
}
catch
(
err
)
{
if
(
err
instanceof
Error
)
{
console
.
error
(
`
${
err
.
constructor
.
name
}
:
${
err
.
message
}
`
);
}
else
{
console
.
error
(
"
Thrown:
"
,
err
);
}
}
}
function
readBlock
(
rid
:
number
,
prompt
:
string
,
continuedPrompt
:
string
):
string
{
let
code
=
""
;
do
{
code
+=
readline
(
rid
,
prompt
);
prompt
=
continuedPrompt
;
}
while
(
parenthesesAreOpen
(
code
));
return
code
;
}
// modified from
// https://codereview.stackexchange.com/a/46039/148556
function
parenthesesAreOpen
(
code
:
string
):
boolean
{
const
parentheses
=
"
[]{}()
"
;
const
stack
=
[];
for
(
const
ch
of
code
)
{
const
bracePosition
=
parentheses
.
indexOf
(
ch
);
if
(
bracePosition
===
-
1
)
{
// not a paren
continue
;
}
if
(
bracePosition
%
2
===
0
)
{
stack
.
push
(
bracePosition
+
1
);
// push next expected brace position
}
else
{
if
(
stack
.
length
===
0
||
stack
.
pop
()
!==
bracePosition
)
{
return
false
;
}
}
}
return
stack
.
length
>
0
;
}
tools/repl_test.py
浏览文件 @
e9327be8
...
...
@@ -80,6 +80,12 @@ class Repl(object):
assertEqual
(
err
,
'TypeError: console is not a function
\n
'
)
assertEqual
(
code
,
0
)
def
test_multiline
(
self
):
out
,
err
,
code
=
self
.
input
(
"(
\n
1 + 2
\n
)"
)
assertEqual
(
out
,
'3
\n
'
)
assertEqual
(
err
,
''
)
assertEqual
(
code
,
0
)
def
test_exit_command
(
self
):
out
,
err
,
code
=
self
.
input
(
".exit"
,
"'ignored'"
,
exit
=
False
)
assertEqual
(
out
,
''
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录