Могу ли я запустить функцию для приглашения оболочки Lua?

#function #lua #command-prompt

#функция #lua #командная строка

Вопрос:

Я могу установить приглашение с _PROMPT = "> " помощью , но могу ли я обновлять приглашение каждый раз?

Я пробовал это, но это не работает:

 i = 0

function inc()
    i = i   1
    return i
end

_PROMPT = inc
  

Это показывает _PROMPT , но ничего не связано:

 for k, v in pairs(_G) do
    print(k)
end
  

Комментарии:

1. К сожалению, единственная причина _PROMPT , по которой она была включена в вывод for k, v in pairs(_G) do print(k) end , заключается в том, что я сам ее установил. Таким образом, я не могу найти какую-либо специальную переменную с помощью этого метода.

2. lua -i -e «_PROMPT = ‘A > ‘ ; _PROMPT2 = ‘B >> ‘»

Ответ №1:

Основным приглашением является значение глобальной переменной _PROMPT, если это значение является строкой; в противном случае используется приглашение по умолчанию.

https://www.lua.org/manual/5.1/lua.html

Вы назначили функцию _PROMPT .

Я пытался

 _PROMPT = {no = 0}; setmetatable (_PROMPT, {__tostring = function (self) self.no = self.no   1; return tostring (self.no) .. ' >' end})
  

, но не повезло, хотя _PROMPT увеличивался каждый раз, когда я печатал = _PROMPT .

UPD И все же это можно сделать! В списке рассылки Lua мне посоветовали использовать

 setmetatable(_ENV, {__index = function(t, k) if k == '_PROMPT' then t._N = (t._N or 0)   1; return t._N .. ' >' end end})
  

Это работает. Это эффективный способ переопределить любой глобальный в более глубоком смысле, чем просто присвоить ему новое значение или сделать набор глобальных переменных фактически бесконечным.

Вы можете запустить Lua в интерактивном режиме с помощью однострочного:

 lua -i -e "setmetatable(_ENV, {__index = function(t, k) if k == '_PROMPT' then t._N = (t._N or 0)   1; return t._N .. ' >' end end})"
  

Ответ №2:

Я нашел метод с debug.sethook() помощью .
Это звучит немного странно, но это действительно просто 😉
Поехали…

 # /usr/bin/lua -i
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
> debug.sethook(function(...) _PROMPT=os.date('%H:%M:%S # ') end,'r')
10:49:42 # -- Hiting ENTER some times
10:51:00 #
10:51:01 #
10:51:05 #
  

(Сделано с Lua 5.3.5 и протестировано 5.4 — должно работать с 5.1, но не протестировано)
'r' Средство: срабатывает при каждом возврате

ОТРЕДАКТИРУЙТЕ
другим способом непосредственно с _PROMPT помощью and _PROMPT2

 -- Simple method for changing and/or time logging the prompts                                                                                                                                 
_PROMPT=setmetatable({},{__index=table})                                                                                                                                                                   
_PROMPT2=setmetatable({},{__index=table})                                                                                                                                                                  

getmetatable(_PROMPT).__tostring=function()
_PROMPT:insert(os.date('%H:%M:%S',os.time())..'> ')
return string.format('%s',_PROMPT:concat(#_PROMPT,#_PROMPT))
end                              

getmetatable(_PROMPT2).__tostring=function()
_PROMPT2:insert(os.date('%H:%M:%S',os.time())..'>> ')
return string.format('%s',_PROMPT2:concat(#_PROMPT2,#_PROMPT2))
end
  

…использование __tostring и __index имеет table метаметоды.

… много веселья и будьте здоровы.