Автор Тема: Lua  (Прочитано 115324 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Lua
« Ответ #195 : Ноябрь 13, 2012, 01:32:03 pm »
Сенкс.
Только еще вопрос в чем кодить. Есть чего нибудь маздайное, простое? К ST2 сложно прикручивать?
На счет прикручивания к плюсам ST2 под виндой - это к vlad :-) Он вроде прикручивал и у него вроде как даже заработало как надо (в том числе отладка).

Как альтернатива - Qt Creator. Оно вроде даже c++11 держит теперь. Надо будет на досуге посмотреть как там на тему прикручивания gcc того который не с ним идет искаропки.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Lua
« Ответ #196 : Ноябрь 13, 2012, 01:35:51 pm »
Но вообще, докури Lua сначала лучше. Пока докуриваешь, поддержка c++11 еще сильнее улучшится :-)

(а я, на досуге, посмотрю что там у MSVS2012 с поддержкой актуальных плюсов)
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Lua
« Ответ #197 : Ноябрь 13, 2012, 01:36:56 pm »
OK  :)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Lua
« Ответ #198 : Ноябрь 13, 2012, 01:41:45 pm »
Да, нашел табличку в плане поддержки компилерами С++11: http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport

Студия оказывается не самый аццтойный компилер имеет. Где-то на третьем месте. :-) Как обычно бесплатные и свободные компиляторы является более качественными и фичастыми ;-)
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Lua
« Ответ #199 : Ноябрь 14, 2012, 08:22:40 am »
А вот и свежая версия компилятора Lua вышла:
http://www.linux.org.ru/news/opensource/8465577
Цитировать
Вышел компилятор для Lua — LuaJit 2.0.

Основные изменения для релиза были в исправлении багов.

Изменения и улучшения по сравнению с первой версией:

* Возможность использования конверсии исключений C++ для всех платформ с помощью функций-обёрток.
* Обёртки для libm функций.
* Сборка static и shared библиотек на POSIX.
* Компилирование рекурсивного кода.
* Портирование интепретатора и JIT компилятора на x86-64.
* Разметка текущего трейса, даже если компилятор не доступен.
* Оптимизация для and/or операторов.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Lua
« Ответ #200 : Ноябрь 14, 2012, 08:28:56 am »
Производительность радует:
http://luajit.org/performance_arm.html
Ну и вообще: http://luajit.org/performance.html
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Lua
« Ответ #201 : Ноябрь 15, 2012, 10:18:54 am »
Свой словарь Completions в ST2 для Lua делается так:
Создаем и сохраняем в любом месте внутри папки packages файл с расширением .sublime-completions
И наполняем его по образцу:
Цитата: Lua.sublime-completions
{
        "scope": "source.lua",

        "completions":
        [
                "print(",
                "setmetatable(",
                {"trigger": "rep", "contents": "string.rep("}
        ]
}

триггеры имеют след. смысл:
Цитировать
"foo"

# is equivalent to:

{ "trigger": "foo", "contents": "foo" }

Подробности тут:
http://docs.sublimetext.info/en/latest/reference/completions.html

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Lua
« Ответ #202 : Ноябрь 16, 2012, 08:09:24 am »
Соорудил свой первый рекурсивный итератор:
function tree(t)
   local i = 1
   local subiter
   local function iter()
      local v = t[i]
      if type(v) == "table" then
         subiter = subiter or tree(v)
         local v = subiter()
         if v then
            return v
         else
            subiter = nil
            i = i + 2
            v = t[i - 1]
            return v
         end
      else
         i = i + 1
         return v
      end
   end
   return iter
end

a = {1,2,3,{1,2,{1,2,3},3},4,5,6,7,8,9}

for v in tree(a) do
   print(v)
end

Пришлось поломать мозг, т.к. замыканиями раньше не пользовался и итераторы не писал.  :)
Кто знает как сделать проще?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Lua
« Ответ #203 : Ноябрь 16, 2012, 08:33:32 am »
Что оно должно делать?
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Lua
« Ответ #204 : Ноябрь 16, 2012, 08:37:03 am »
Просто перебрать все элементы дерева.
Этот мой код выдает такое:
Цитировать
1
2
3
1
2
1
2
3
3
4
5
6
7
8
9

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Lua
« Ответ #205 : Ноябрь 18, 2012, 10:37:05 am »

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Lua
« Ответ #206 : Ноябрь 20, 2012, 05:13:13 pm »
Поигрался немного со строковой либой:
http://www.lua.org/manual/5.1/manual.html#5.4
Работать с ней одно удовольствие (несмотря на скромный набор функций)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Lua
« Ответ #207 : Ноябрь 20, 2012, 05:27:15 pm »
Поиск парных сбалансированных символов:
s = '2*(10*(x+1)-2)+5'

-- ищем парные скобки
print(s:find("%b()"))
-- log: 3    14

-- ищем парные скобки начиная с 4 символа
print(s:find("%b()", 4))
-- log: 7    11

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Lua
« Ответ #208 : Ноябрь 20, 2012, 05:55:55 pm »
Еще очень понравилось что в функции замены подстроки (string.gsub (s, pattern, repl [, n]))
вместо подстроки замены (repl) можно передать функцию. А так как есть замыкания....  ;)

Пример:
function foo(t)
    local i = 0
    return function(s)
        i = i + 1
        t[i] = s
        return "#"
    end
end

local text = 'sdfsdfsd48sdfsd15dsfsd72dsfs69'
local t = {}

text = text:gsub("%d", foo(t))

print(text)
for i,v in ipairs(t) do
    print(i,v)
end

-- log:
--[[
sdfsdfsd##sdfsd##dsfsd##dsfs##
1    4
2    8
3    1
4    5
5    7
6    2
7    6
8    9
--]]

Тут замыкание собирает все циферы в массив t

если поменять паттерн на "%d+" то получим такой лог:
sdfsdfsd#sdfsd#dsfsd#dsfs#
1    48
2    15
3    72
4    69

Йа тащусь  :D
« Последнее редактирование: Ноябрь 20, 2012, 05:58:06 pm от ilovb »

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Lua
« Ответ #209 : Ноябрь 22, 2012, 09:35:46 am »
Запилил себе тулзу, которая выдирает метаданные из буфера обмена 1С.
require'clipboard'

format = {}
for k,v in ipairs(clipboard.getformats() or {}) do
    formatname = clipboard.formatname(v)
    if formatname then
        format[formatname] = v
    end
end

data = clipboard.getdata(format["1C:MD8 Data"])


if data then
   
   
    pattern = '%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x'
   
    data = data:gsub(pattern, "{}"):sub(4)
   
   
    t = loadstring("return"..data)()
   
    result = ""
    t1 = t[1]
   
    for i = 2, t1[1] + 1 do
        result = result .. t1[i][2][1][2][2][2][3] .. "\n"
    end
   
    print(result:format('%q'))
    clipboard.settextu(result:format('%q'))
   
end

Требует либу:
http://files.luaforge.net/releases/jaslatrix/clipboard/1.0.0

Мануал:  :)
1. В пофигураторе нажимаем ctrl+c на реквизитах объекта метаданных (в буфере слово "Реквизиты")
2. Вызываем скрипт
3. Теперь у нас в буфере список реквизитов  :)

зы Чтобы скрипт не показывал окно нужно поменять расширение на .wlua (при условии что установлен Lua for windows)