четверг, 11 сентября 2014 г.

Азы git

Пришлось на днях объяснять азы гита. 

Часть 1

В отличие от многих других систем контроля версий (cvs) git оперирует не файлами, а строками. Т.е. для него первичны строки, а файлы им воспринимаются как некие контейнеры для строк. Например, если удалить какой-либо файл, то гит запишет это в своем репозитории (базе данных) именно как удаление всех строк из файла, впрочем сам файл он тоже пометит как удаленный, чтоб немелькал зазря в списках файлов (например, выдаваемый по команде git ls-files).

С git можно не беспокоится чего-то потерять. Он сохраняет ВСЕ изменения, в том числе и удаленные строки и файлы, и их всегда можно посмотреть и при необходимости откатить обратно. (Однако бойтесь команд с опциями --force или --hard - с ними все-таки можно что-то потерять).

пятница, 15 августа 2014 г.

Шпаргалка по Lua

-- с двойного тире начинается однострочный комментарий

--[[
    А если добавить двойные квадратные скобки
    получится многострочный комментарий
--]]
----------------------------------------------------
-- 1. Переменные и управляющие конструкции
----------------------------------------------------

num = 42  -- Все числа в Lua представляют из себя числа с плавающей точкой двойной точности (double)
-- Не переживайте, у 64-битных double имеется 52 бита
-- для хранения точных целочисленных (int) значений;
-- для целочисленных значений, которым нужно менее 52 бит, никаких проблем не возникнет

s = 'walternate'  --строки неизменны (нельзя переназначать) как в Рython'e
t = "double-quotes are also fine" -- можно использовать и двойные кавычки
u = [[ Double brackets         
             start and end           
             multi-line strings.]]   -- Двойные квадратные скобки 
                                     -- обрамляют многострочные строки (strings)
t = nil  -- обнуляет t; В Lua имеется "сборщик мусора"

четверг, 14 августа 2014 г.

Калькулятор на Lua в 30 строк

Захотелось написать зародыш компилятора )))

Интерпретатор:
function   oper(src) return src:match'^([-+*/]?)%s*(.*)' end
function number(src) return src:match'^(%d*)%s*(.*)' end
operators = {
    {
        ['+'] = function(a,b) return a+b end,
        ['-'] = function(a,b) return a-b end
    },{
        ['*'] = function(a,b) return a*b end,
        ['/'] = function(a,b) return a/b end
    }
}

function expr(src, pri)
    local a,b,n,r,op
    pri = pri or 1
    op = operators[pri]
    if op then
        a, src = expr(src, pri+1)
        r, src = oper(src)
        while op[r] do
            b, src = expr(src, pri+1)
            a = op[r](a,b)
            r, src = oper(src)
        end
        return a, r..src
    end
    r, src = number(src)
    if r=='' then error('number expected: '..src) end
    return r, src
end

print(expr('2 + 2 * 3')) -- 8
В operators операции расположены по приоритетам (низкий в начале). Можно добавлять свои операции.