Ликбез по Lua

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
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.

Для того, чтобы получить начальное представление о языке достаточно почитать какую-нибудь короткую обзорную статью, например:
Для более близкого знакомства рекомендую эти документы:
Misha60
Posts: 1
Joined: Wed 03 Apr, 2013 14:30

Re: Ликбез по Lua

Post by Misha60 »

Latest post of the previous page:

Помогите, пожалуйста, исправить ошибку в строке 43 (\?r). xupnpd_ex.lua:

Из-за этой ошибки не запускается xupnpd.
Заранее благодарю.
Last edited by Misha60 on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: [codebox=lua file=untitled.lua]
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Ликбез по Lua

Post by John Doe »

В чём может быть причина странного поведения math.random?

lm:post print(math.random(2^30)) - нормально
lm:post print(math.random(2^31)) - не работает
lm:post print(math.random(2^74)) - снова работает
lm:post print(math.random(2^100)) - с виду работает, но возвращает значение в диапазоне от 1 до ~30
2useven10
Posts: 5211
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

Re: Ликбез по Lua

Post by 2useven10 »

2 ^ (100 % 32) = 2 ^ 4
2 ^ (74 % 32) = 2 ^ 10

?
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Ликбез по Lua

Post by Shmuel »

John Doe wrote:В чём может быть причина странного поведения math.random?
Вот в этом (из stdlib.h):

Code: Select all

#define	RAND_MAX	0x7FFF
Возможно, в LuaJIT 2 или Lua 5.2 это по-другому.
Для серьёзных работ со случайными числами рекомендуются специализированные библиотеки, например, эта.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Ликбез по Lua

Post by John Doe »

Shmuel wrote:Вот в этом (из stdlib.h)
В этом не может быть, т.к. возвращает явно больше 32767: lm:post print(math.random(2^30))
Плюс непонятная реакция на значения в интервале 2^31 .. 2^73
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Ликбез по Lua

Post by Shmuel »

John Doe wrote:
Shmuel wrote:Вот в этом (из stdlib.h)
В этом не может быть, т.к. возвращает явно больше 32767: lm:post print(math.random(2^30))
Плюс непонятная реакция на значения в интервале 2^31 .. 2^73
Причина именно в том, что я сказал. Я не утверждал, что результат ограничен величиной RAND_MAX.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Lua Explorer „Advanced“

Post by John Doe »

Таблицы сортируются в lua explorer так: table.sort(items, function(v1, v2) return v1.text < v2.text end)

Пытаюсь использовать другую функцию сортировки
table.sort(items, function() return true end)

Получаю: C:\apps\far3\Profile\Macros\modules\le.lua:125: invalid order function for sorting
Не могу понять как такое возможно. Если return false то без ошибок.

Проблему могу воспроизвести только в lua explorer
Бред какой-то...
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Lua Explorer „Advanced“

Post by Max Rusov »

John Doe wrote:Не могу понять как такое возможно
Может там защита стоит от "левых" функций? Некоторые алгоритмы сортировки при такой функции просто зациклятся...
2useven10
Posts: 5211
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

Re: Ликбез по Lua

Post by 2useven10 »

true - действительно 'левая' ф-я, т.к. a < b & b < a & a < a.
false - вполне валидна, если не учитывать, что все элементы равны друг другу.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Ликбез по Lua

Post by John Doe »

Max Rusov wrote:Может там защита стоит от "левых" функций?
Вы правы, об этом и сказано в сообщении об ошибке.

Но в таком случае помогите найти ошибку:
  1. local t = {1,{2},3,4}
  2.  
  3. table.sort(t, function (a,b)
  4.  
  5.     if (type(a)=="table" or type(b)=="table") and
  6.  
  7.        not (type(a)=="table" and type(b)=="table") then
  8.  
  9.          return type(a)=="table"
  10.  
  11.     else
  12.  
  13.        return  tostring(a)<tostring(b)
  14.  
  15.     end
  16.  
  17. end)
  18.  
  19. require"le"(t)
Цель: отсортировать так, чтобы элементы-таблицы были в начале.
2useven10
Posts: 5211
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

Re: Ликбез по Lua

Post by 2useven10 »

а в чём проблема? если скормить это lua.exe -- всё работает.
2useven10
Posts: 5211
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

Re: Ликбез по Lua

Post by 2useven10 »

  1. local t = {1,{2},3,4}
  2.  
  3. table.sort(t, function (a,b)
  4.  
  5.   if (type(a)=="table" or type(b)=="table") and not (type(a)=="table" and type(b)=="table") then
  6.  
  7.     return type(a)=="table"
  8.  
  9.   else
  10.  
  11.     return  tostring(a)<tostring(b)
  12.  
  13.   end
  14.  
  15. end);
  16.  
  17. print(tostring(t[1]), tostring(t[2]), tostring(t[3]), tostring(t[4]))

Code: Select all

table: 000000000033BC50 1       3       4
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Ликбез по Lua

Post by Max Rusov »

  1. if (type(a)=="table" or type(b)=="table") and not (type(a)=="table" and type(b)=="table") then
Можно короче:
  1. if (type(a)=="table") ~= (type(b)=="table")) then
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Ликбез по Lua

Post by John Doe »

2useven10
Да, это я перемудрил, проблема оказывается была в lua explorer

Кстати

Code: Select all

print(tostring(t[1]), tostring(t[2]), tostring(t[3]), tostring(t[4]))
1. tostring не нужен, стандартный print это сам
2. перечислять массив не нужно, есть функция unpack
  1. print(unpack(t))
Max Rusov
Таблицы вперёд, но и остальное тоже надо отсортировать (в условиях я не оговорил, да)
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Ликбез по Lua

Post by Max Rusov »

John Doe wrote:Таблицы вперёд, но и остальное тоже надо отсортировать (в условиях я не оговорил, да)
Я только про отквоченный фрагмент.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: Ликбез по Lua

Post by John Doe »

Спасибо, что-то xor мне тяжело даётся :-)
Post Reply

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