Desconto lua

Continuando com minhas aventuras no Markdown para mdcat e amigos, um dos meus computadores não tinha desconto nos repos. Em vez de apenas construir o comando markdown a partir da fonte, achei que seria mais divertido fazer uma implementação rápida do comando em Lua. (Eu também fiz isso para ter uma desculpa para postar protip com uma tag Lua.)

Decidi ir com lua-desconto em vez de descontos (ambos instaláveis ​​por meio de fechaduras). O motivo é a velocidade. Para dar uma boa estimativa aproximada: para analisar e exibir um arquivo 11M, leva uma redução de Lua em torno de 62 segundos, uma redução de desconto em cerca de 0,87 segundos e uma redução de desconto em lua em cerca de 0,9 segundos com Lua 5.1.5. Acho que isso é muito aceitável em termos de velocidade e os resultados não são surpreendentes, pois eles estão usando basicamente o mesmo código (um está apenas sendo chamado de dentro de Lua).

Agora, como implementei meu comando de redução de desconto lua. Na verdade, é muito simples e como você provavelmente espera que seja implementado. Eu verifico os argumentos da linha de comando e envio cada arquivo para descontar e escrever os resultados. Se não houvesse argumentos de linha de comando, eu li de stdin.

discount=require("discount")
if #arg > 0 then
for _,v in ipairs(arg) do
local lines = ""
local f = io.open(v, "r")
if not f then
io
.output(io.stderr):write(string.format([[%s: No such file or directoryn]], v))
os
.exit(1)
end

io
.write(discount(f:read("*a")))
f
:close()
end
else
local lines = ''
while true do
local line = io.read()
if not line then
break
end
lines
= string.format('%s\n%s', lines, line)
end
io
.write(discount(lines))
end

Na tradição da mdcat e amigos, decidi incorporar o código Lua acima em uma função shell. Então aqui está a função shell (sem o código acima marcado com <LUA MARKDOWN CODE>

function markdown()
{
lua5
.1 <(echo "$(cat << EOLUA
<LUA MARKDOWN CODE>

EOLUA

)"
) $*
}

Ao todo, a função shell tem 30 linhas com o código Lua embutido.

Agora, o único problema com a implementação de Lua é que ela não lida com arquivos muito grandes. Para esclarecer “muito grande”, direi o seguinte: um arquivo de 41M funcionou bem, mas um arquivo de 56M falha com esta implementação. O arquivo 56M, entretanto, funciona com a redução de desconto. Eu realmente não investiguei exatamente o porquê, mas acho que estou ok em não poder usar essa implementação para arquivos maiores que 41M-56M.