Re[3]: implicit operator bool
От: kov_serg Россия  
Дата: 24.03.24 20:04
Оценка: :)
Здравствуйте, rg45, Вы писали:

R>нам на каком-нибудь "приятном языке" аналог вот такой простенькой программки:



-- main.lua

function dot(a,b) local r=0
    if #a~=#b then error "invalid args" end
    for i=1,#a do r=r+a[i]*b[i] end
    return r
end
function printf(...) print(string.format(...)) end

print[[/* main.c */
#include <stdio.h>

int main(int argc,char** argv) {]]
printf('\tprintf("%s\\n");',dot( {1,2,3}, {6,7,8} ) )
printf('\tprintf("%s\\n");',dot( {1,2,3,4,5}, {6.1,7.3,8.0,9,10} ) )
print[[    return 0;
}]]

lua main.lua > main.c
/* main.c */
#include <stdio.h>

int main(int argc,char** argv) {
    printf("44\n");
    printf("130.7\n");
    return 0;
}

gcc -O2 main.c && ./a.out
44
130.7

  или так
require "utils"

function dot(a,b) local r=0
    if #a~=#b then error "invalid args" end
    for i=1,#a do r=r+a[i]*b[i] end
    return r
end

T=template{ 
    c1=dot( {1,2,3}, {6,7,8} ),
    c2=dot( {1,2,3,4,5}, {6.1,7.3,8.0,9,10} ),
}

print(T[[
/* main.c */
#include <stdio.h>

int main(int argc,char** argv) {
    printf("{{c1}}\n");
    printf("{{c2}}\n");
    return 0;
}
]])

  utils.lua
function base64(s)
    local n,a,res,b64
    b64='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
    n=0 a=0 s=s:gsub('[^A-Za-z0-9+/=]','');
    local function ch(a,r,n) local x={}
        a=a>>r for i=1,n do x[i]=(a>>8*(n-i))&255 end
        return string.char(table.unpack(x))
    end
    local function tl() local r=''
        if n==3 then r=ch(a,2,2)
        elseif n==2 then r=ch(a,4,1) end
        return r
    end
    res=s:gsub('[A-Za-z0-9+/=]',function(x) local r=''
        if x=='=' then r=tl() n=4 else
            a=a*64+b64:find(x)-1 n=n+1
            if n==4 then r=ch(a,0,3) n=0 a=0 end
        end
        return r
    end)
    return res..tl()
end

function create(name,decoder) decoder=decoder or base64 
    local f=io.open(name,"wb")
    return function(data) f:write(decoder(data)) f:close() end
end

function xml_encode(x) 
    local tab={ ['<']='&lt;',['>']='&gt;',
        ['&']='&amp;',['"']='&quot;',["'"]='&apos;' }
    return x:gsub("[<>&'\"]",function(v) return tab[v] end)
end

function template(G) G=G or _G local get_fn
    function get_fn(m) local fn
        fn=function(t) if t==nil then return fn end
            if type(t)=='table' then G=setmetatable(t,{__index=G}) return fn end
            if type(t)=='function' then
                if m then return get_fn(function(x) return m(t(x)) end) end
                return get_fn(t)
            end
            local r=t:gsub('{{([^}]+)}}',function(v)
                local g=G for i in v:gmatch("[^%.]+") do
                    local p,fn=i:find('|')
                    if p then fn=i:sub(p+1) i=i:sub(1,p-1) end
                    if type(g[i])=='function' then g=g[i]() else g=g[i]
                        if g==nil then error("no variable "..i.." in {{"..v.."}}") end
                    end
                    if p then fn:gsub('[^|]+',function(f)
                            if G[f]==nil then error("no function "..fn.." in {{"..v.."}}") end
                            g=G[f](g)
                        end)
                    end
                end
                return g
            end)
            if m then r=m(r) end
            return r
        end
        return fn
    end 
    return get_fn()
end

function create_text(name,G) return create(name,template(G)) end

function ansi_encode(x)
    local tab={ ['\0']='\\0',['\n']='\\n',['\r']='\\r',
        ['\t']='\\t',['\a']='\\a',['\\']='\\\\',['"']='\\"' };
    return x:gsub('[\x00-\x1f\\\"\x80-\xFF]',function(v)
        if tab[v]~=null then return tab[v] end
        return string.format("\\x%02X",string.byte(v))
    end)
end

function hex_encode(x)
    return x:gsub('.',function(v)
        return string.format("%02X",string.byte(v))
    end)
end

function string.split(s,delim,limit,plain)
    local res,pos,t,h={},1
    delim=delim or ',' limit=limit or 0 plain=plain or false
    while pos do
        h,t=s:find(delim,pos,plain)
        if h then h=h-1 t=t+1 end
        limit=limit-1 if limit==0 then h=null t=null end
        table.insert(res,s:sub(pos,h))
        pos=t
    end
    return res
end
Re[4]: implicit operator bool
От: rg45 СССР  
Дата: 24.03.24 22:45
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, rg45, Вы писали:


R>>нам на каком-нибудь "приятном языке" аналог вот такой простенькой программки:


_>


Зачетный троллинг
--
Re[4]: implicit operator bool
От: CreatorCray  
Дата: 19.04.24 00:43
Оценка: +1
Здравствуйте, andrey.desman, Вы писали:

Я для флаговых типов делаю что то вроде
enum Flags;
static constexpr Flags operator| (Flags a, Flags b)        {return Flags (size_t (a) | size_t (b));}
static constexpr bool operator& (Flags a, Flags b)        {return bool (size_t (a) & size_t (b));}

И дальше как с обычными флагами:
    if (flags & (FLAG_A | FLAG_B)) ...


... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.