为什么Lua REPL需要在输入值时加上等号才能获取值?

我需要帮助关闭这个功能,如果可能的话,从交互模式,否则我会发疯的。REPL坚持在每个表达式之前加上等号,如果您想要值。我发现这非常令人恼火和不直观。更糟糕的是,如果您错误地忘记了等号,它会带您到这个次要提示,只能通过输入一个将导致错误的表达式来退出。

*** str="This is some string"
*** str
>>
>>
>> =
>>
>> =str
stdin:6: unexpected symbol near '='
*** =str
This is some string
*** #str
stdin:1: unexpected symbol near '#'
*** =#str
19
***
*** 545+8
stdin:1: unexpected symbol near '545'
*** =545+8
553
***

我需要学习使用REPL:

有没有办法摆脱等号,使其行为像其他REPL一样?

如何在不做我所做的那样的情况下退出次要提示?

点赞
用户828255
用户828255

独立 Lua中,您输入的所有内容都被视为语句,而不是表达式。这些语句将被评估,并且它们的结果(如果有)将被打印到终端上。这就是为什么您需要在您提供的表达式前面添加=实际上是return的速记)才能使它们正常地显示而不出错的原因。

您看到的“辅助提示符”是当您输入不完整的语句时发生的情况。

在交互模式下,如果您编写不完整的语句,解释器将等待其完成,并发出不同的提示符。

通过完成该语句退出它。


然而,制作自己所需的 REPL 并不太困难。当然,这样你失去了逐步从不完整的块中构建语句的能力,但也许你不需要那个。

local function print_results(...)
    -- This function takes care of nils at the end of results and such.
    if select('#', ...) > 1 then
        print(select(2, ...))
    end
end

repeat -- REPL
    io.write'> '
    io.stdout:flush()
    local s = io.read()
    if s == 'exit' then break end

    local f, err = load(s, 'stdin')
    if err then -- Maybe it's an expression.
        -- This is a bad hack, but it might work well enough.
        f = load('return (' .. s .. ')', 'stdin')
    end

    if f then
        print_results(pcall(f))
    else
        print(err)
    end
until false
2013-12-05 21:37:30
用户1009479
用户1009479

自 Lua 5.3 版本开始,你不再需要使用 = 了,因为 Lua 现在会尝试先将其解释为表达式。

来自参考手册的说明:

在交互模式中,Lua 会不断地提示和等待输入。读取完一行后,Lua 首先尝试将该行解释为表达式。如果成功,它会打印其值。否则,它将该行解释为语句。如果你输入了不完整的语句,解释器会用另一种提示等待其完成。

以下是一个小测试:

Lua 5.3.0  Copyright (C) 1994-2014 Lua.org, PUC-Rio
> str = 'hello' .. ' Lua'
> str
hello Lua
> 1 + 2
3
>

2015-11-04 01:04:27