Ликбез по Lua

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
John Doe
Бюрократ
Posts: 13861
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Ликбез по Lua

Post by John Doe »

В данной теме задаём вопросы по Lua.

Для того, чтобы получить начальное представление о языке достаточно почитать какую-нибудь короткую обзорную статью, например:
Для более близкого знакомства рекомендую эти документы:
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Ликбез по Lua

Post by Shmuel »

Latest post of the previous page:

gotar wrote: Sat 13 Aug, 2022 12:48 Есть ли в Lua возможность сохранить хэштаблицу в виде текстового файла, и позже восстановить эту хэштаблицу в оперативной памяти из этого файла?
Для этого существуют библиотеки сериализации. В том числе в Фаре (mf.serialize / mf.deserialize).
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Ликбез по Lua

Post by gotar »

как прочитать строку из файла, созданную с помощью string.format("%q", o), если после нее могут идти какие-то данные?
Last edited by gotar on Sat 13 Aug, 2022 18:51, edited 1 time in total.
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Ликбез по Lua

Post by Shmuel »

gotar wrote: Sat 13 Aug, 2022 18:51 как прочитать строку из файла, созданную с помощью string.format("%q", o), если после нее могут идти какие-то данные?
Извлечь можно с помощью нетривиального регулярного выражения.
Но надо иметь в виду, что %q не предназначен для последующего распарсивания, а предназначен для создания текста, который, будучи скормленным ф-ции loadstring, восстановит исходную строку.
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Ликбез по Lua

Post by gotar »

Мой Lua script пишет в файл. Как сделать так, что если в двух фарах одновременно будет вызван этот скрипт, то они бы синхронизировались при записи в файл? Если бы я писал на C в Uniх я бы вызвал функцию flock. А здесь как?
Last edited by gotar on Sat 13 Aug, 2022 22:01, edited 1 time in total.
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Ликбез по Lua

Post by Shmuel »

gotar wrote: Sat 13 Aug, 2022 21:53 Мой Lua script пишет в файл.
Если бы вы более подробно расписали ваш сценарий (что и зачем пишется в файл), ответ мог бы быть более полезным.
А так - возможны варианты, например:
  • использовать SQLite, которая сделает синхронизацию за вас
  • использовать FFI и Windows API, в котором есть необходимые средства для залочивания файлов
  • использовать внешнюю Lua-библиотеку, обладающую подобными средствами (такие библиотеки есть)
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Ликбез по Lua

Post by gotar »

Shmuel wrote: Sun 14 Aug, 2022 06:16 Если бы вы более подробно расписали ваш сценарий (что и зачем пишется в файл), ответ мог бы быть более полезным.
Есть скрипт, который в один момент пишет серализованные данные в файл, а в другой момент их читает. Понятное дело, что если этот скрипт работает одновременно в нескольких экземплярах Фара, то доступ к этому файлу должен быть синхронизирован между различными экземплярами скрипта. Сам скрипт, это вариация скрипта Editor_Retentive.luа из набора SimSU с сохранением данных в файл.
Shmuel wrote: Sun 14 Aug, 2022 06:16 использовать SQLite
Из пушки по воробьям плюс довольно медлено.
Shmuel wrote: Sun 14 Aug, 2022 06:16 использовать внешнюю Lua-библиотеку, обладающую подобными средствами (такие библиотеки есть)
, а можно здесь по подробнее, все что я находил в Google касалась Unix. Подходящей библиотеки в Windows я не нашел.
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Ликбез по Lua

Post by Shmuel »

gotar wrote: Sun 14 Aug, 2022 08:02 а можно здесь по подробнее, все что я находил в Google касалась Unix. Подходящей библиотеки в Windows я не нашел.
Самая известная для работы с файлами - LuaFileSystem. Она работает и на Windows, и на Linux.
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Ликбез по Lua

Post by gotar »

Как получить filehandle, используемый в этой библиотеке, из того что возвращает io.open?
Last edited by gotar on Sun 14 Aug, 2022 09:11, edited 1 time in total.
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Ликбез по Lua

Post by gotar »

  1. local lfs = require "lfs"
  2.  
  3. local le=require"le"
  4.  
  5. local rc,err,f
  6.  
  7. far.Show( win.GetCurrentDir ())
  8.  
  9. f,err=io.open("test.txt", "r")
  10.  
  11. far.Show(f,err)
  12.  
  13. rc,err=lfs.lock(f,'r')
  14.  
  15. far.Show(rc,err)
  16.  
  17.  
  18.  
  19. f:write("hello")
  20.  
  21. f:flush()
  22.  
  23.  
  24.  
  25. assert(lfs.unlock(f))
  26.  
  27. f:close()
в восьмой строке возвращает ошибку "Invalid argument". Что я не так делаю?
Last edited by gotar on Sun 14 Aug, 2022 11:24, edited 3 times in total.
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Ликбез по Lua

Post by Shmuel »

Попробуйте rc,err=lfs.lock(f:rawhandle(),'r')
Last edited by Shmuel on Sun 14 Aug, 2022 12:45, edited 1 time in total.
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Ликбез по Lua

Post by gotar »

testlock.lua:7: rawhandle is only available in GCC compilations.
В исходниках lfs.lock

Code: Select all

 code = _locking(fileno(fh), lkmode, len);
 
т.е. filehandler должен быть обычным FILE *.
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Ликбез по Lua

Post by Shmuel »

Сейчас поигрался практически.
Если luafar3.dll собрана GCC, то это работает, а если Visual Studio - то нет.
При сборке посредством Visual Studio функция fopen создаёт хэндл, несовместимый с тем, чего ожидает LuaFileSystem.
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Ликбез по Lua

Post by gotar »

Может быть у Вас есть lfs.dll 64bit совместимая с luafar3.dll? Или Вы можете собрать lfs.dll из исходников правильным компилятором?

Luafar3.dll плохо, т.к. может еще что-нибуть отвалиться, а при очередном обновлении фара вернется старый вариант
Last edited by gotar on Sun 14 Aug, 2022 15:03, edited 3 times in total.
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Ликбез по Lua

Post by Shmuel »

У меня, боюсь, более старая версия Visual Studio, чем та, которой собирается Фар.
И кроме того, я у себя всегда собираю библиотеки посредством GCC.
Поэтому то, что вы предлагаете, с одной стороны для меня времязатратно, с другой - нет уверенности, что будет работать.
Могу только предложить luafar3.dll + lfs.dll, собранные GCC.
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Ликбез по Lua

Post by gotar »

Luafar3.dll обновлять плохо, т.к. может еще что-нибуть отвалиться, а при очередном обновлении фара вернется старый вариант. Не думаю что смещение, по которому находится номер потока ввода/вывода в структуре FILE часто меняется, поэтому версия Visual Studio не имеет значения
Last edited by gotar on Sun 14 Aug, 2022 15:10, edited 1 time in total.
Shmuel
Posts: 6840
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Ликбез по Lua

Post by Shmuel »

Как автор luafar, могу заверить, что ничего не может отвалиться.
Что могу предложить, уже предложил.
Post Reply

Return to “Нужна помощь”