Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Lua REPL要求您在前面加一个等号以获得一个值?_Lua_Read Eval Print Loop - Fatal编程技术网

为什么Lua REPL要求您在前面加一个等号以获得一个值?

为什么Lua REPL要求您在前面加一个等号以获得一个值?,lua,read-eval-print-loop,Lua,Read Eval Print Loop,我需要帮助关闭这个功能,如果可能的话,从互动模式,否则我会发疯。如果需要该值,REPL将坚持在每个表达式之前使用等号。我觉得这很烦人,也不直观。更糟糕的是,如果您错误地忘记了等号,它会将您带到这个第二个提示,该提示只能通过 键入将导致错误的表达式 *** str="This is some string" *** str >> >> >> = >> >> =str stdin:6: unexpected symbol near '='

我需要帮助关闭这个功能,如果可能的话,从互动模式,否则我会发疯。如果需要该值,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相同?
如何在不执行我所做的操作的情况下退出辅助提示?

您输入的所有内容都被视为语句,而不是表达式。对语句进行评估,并将其结果(如果有)打印到终端。这就是为什么您需要将
=
(实际上是
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

由于Lua5.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
> 

你的意思是想在输入的所有内容前加上
return
?不确定
return
是如何输入的,但我不想每次想查看值时都按
=
。它有点超出了repl的目的。开头的
=
是独立Lua中
返回的缩写
可能足以退出辅助提示。
545+8
不是Lua语句,因此无法返回任何内容。Lua REPL已经打印了语句返回的任何值,但它不能像前面解释的那样用作计算器。我得到了
错误的参数#1到'load'(预期函数,得到字符串)
。当您使用
loadstring
loadstring(“print(“..s..”)”)(
)时,它可以工作,但不幸的是,它只能用作计算器。@在Lua 5.2中,使用
load
;在Lua5.1中,使用
loadstring
。您可能正在使用Lua 5.1它现在可以工作了。非常好。我想我可以这样做。我会反转语句/表达式尝试,这样
f()
将打印结果(假设函数返回一个值)。