Ликбез по Lua

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

Ликбез по Lua

Post by John Doe »

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

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

Ликбез по Lua

Post by Shmuel »

Latest post of the previous page:

John Doe wrote:Есть ли разница между io.stdout и io.output() ?
При запуске интерпретатора, наверное, разницы нет. Но если исполнить io.output("foo.txt"),
то с этого момента разница будет.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Ликбез по Lua

Post by John Doe »

Code: Select all

local t = {
  a=true,
  a={},
  a="str",
  a=0,
  a=false,
  a=nil,
}
far.Show(t.a)
Мануал не регламентирует поведение в этом случае.

Интуитивно кажется, что результат должен равняться последней строке определения таблицы, т.е. 0.
Или первой, т.е. true.
А в реальности "побеждает" a={}.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Ликбез по Lua

Post by Shmuel »

John Doe wrote: А в реальности "побеждает" a={}.
Это верно для LuaJIT 2.0.4.
Для Lua 5.1, 5.2 и 5.3 побеждает nil.
User avatar
SUSim
Posts: 1636
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Ликбез по Lua

Post by SUSim »

Ковырял, ковырял, но не смог изменить штатными средствами макроса дату каталога (ну кроме вызывания диалога атрибутов клавишами)
Хотел оптом изменить атрибут времени у нескольких элементов.

Если изменить время файла средствами lua невозможно, подскажите ffi код позволяющий изменить время файла/директории.

Идея макроса такова - при обновлении какого либо файла обновляется время всех родительских папок, чтобы из корня видеть и добраться до всех последних изменений.
SimSU ··· ·· -- ··· ··-
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Ликбез по Lua

Post by HaRT »

Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
SUSim
Posts: 1636
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Ликбез по Lua

Post by SUSim »

HaRT wrote:
В первом приближении хоть вручную, т.е. я изменил файл нажал кнопку и время всех родительских папопок изменилось на текущее.
Вопрос именно про возможность изменения времени а не только атрибутов средствами ЛУА.
SimSU ··· ·· -- ··· ··-
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Ликбез по Lua

Post by Shmuel »

FFI. SetFileTime. Или искать готовую библиотеку. Похоже, что в LuaFAR нет подходящей функции.
Karagy
Posts: 57
Joined: Tue 02 May, 2006 08:43
Location: Питер
Been thanked: 3 times

Ликбез по Lua

Post by Karagy »

Предлагаю добавить в шапку замечательный перевод о истории языка Эволюция языка расширений: история Lua.
Кстати, раскрывающий пользу консервативности при разработке. А то я тут насмотрелся метаний с "total folder size in panel" - яркий пример неконсервативного подхода -)

P.S. Часть ссылок в шапке - уже мёртвые.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Ликбез по Lua

Post by buniak_a_h »

John Doe wrote:Дело в том, что стандартные функции lua не рассчитаны на работу с массивами, содержащими nil.
В вашей SHOW надо учесть количество элементов, и указывать его в unpack.
См. функцию select.
http://plugring.farmanager.com/downld/files/lookdbf.zip
Не подскажете, где можно прочитать об этой и аналогичных странностях LUA? Согласитесь, ситуация когда
lua:=unpack({1,nil,'q',false,nil,'zzz'})
возвращает

Code: Select all

1│ 1
2│ nil
3│ q
4│ false
5│ nil
6│ zzz
а тоже самое без второго элемента
lua:=unpack({1,'q',false,nil,'zzz'})
возвращает

Code: Select all

1│ 1
2│ q
3│ false
очень напоминает ошибку...
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Ликбез по Lua

Post by zg »

buniak_a_h wrote:очень напоминает ошибку...
http://www.freelists.org/post/luajit/le ... e-arrays,3
User avatar
Aidar
Posts: 541
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 7 times
Contact:

Ликбез по Lua

Post by Aidar »


User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Ликбез по Lua

Post by buniak_a_h »

Aidar wrote:
<...>
2.5.5 - Получение длины
...
Длиной таблицы t считается любой целый индекс n такой, что t[n] не равен nil, а t[n+1] равно nil.
Не объясняет первый пример. Либо должно работать одинаково (до первого nil-а), либо всё же похоже на ошибку.
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Ликбез по Lua

Post by John Doe »

buniak_a_h wrote: до первого nil-а
Такого в мануале нет
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

Ликбез по Lua

Post by gene.pavlovsky »

Сделал вот такие три функции


Хочется их вынести в modules/stringutil.lua и подключать его из макросов, где нужно
Вопросы:
1) Если просто убрать local, и подключать модуль require "stringutil" - ф-ции становятся доступными и работают.
Красиво ли так поступать, или есть какая-то другая общепринятая практика? При проверке luacheck-ом он выдаёт warnings: setting non-standard global variable "substr" и остальные.
2) В идеале хочется, чтоб при подключении require "stringutil" эти ф-ции появлялись в string, и можно было писать str:substr(...).
Попробовал добавить string.substr = substr в конце stringutil.lua - ошибок нет, но при попытке задействовать str:substr(...) ругается на substr - nil value. Как бы это оформить?
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Ликбез по Lua

Post by Shmuel »

1. Общепринятая практика - возвращать в таблице, например return { substr=substr; charAt=charAt }
2. unicode.utf8.substr = substr
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Ликбез по Lua

Post by John Doe »

gene.pavlovsky wrote: эти ф-ции появлялись в string, и можно было писать str:substr(...).
При обмене скриптами рано или поздно возникнет ситуация, когда этих функций у конечного пользователя не окажется, а вы этого и не заметите, ведь при таком использовании не требуется require в каждом скрипте.

Вообще, глядя на приведённые функции, кажется что их лучше заменить идиомами lua.

substr: str:sub(index or 1,length and ((index or 1)+ length-1) or -1 или

charAt: str:sub(index or 1, index or 1)

charCodeAt: str:byte(index) или charAt(index):byte()
Post Reply

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