| Author |
Message |
|
|
|
http://luaforge.net/projects/luainterface/
|
 |
|
|
Я не уверен, что я точно понял, чего вам хочется. Вот: функция stream_maker делает бесконечный ленивый поток поток натуральных чисел, а функция lift лифтит две скалярные унарные функции и исходный поток до бесконечного потока пар значений функций.
печатает:
|
 |
|
|
smz wrote:Ну а теперь - третий тест: такой же, как предыдущие два, только pattern = ".-"
gmatch2 - работает неправильно.
gmatch3 - больше не проверяю.
[перешёл в режим read-only для этой темы  ]
Я готов признать победу метода с определением длины Особенно в условиях того, что узнать о том что и когда возвращает string.find из документации нельзя.
|
 |
|
|
smz wrote:
Не работает ни на одном из 2-х тестов. Вот что печатается:
А, ну это фича - поскольку итератор stateless он по контракту должен на первой позиции вернуть индекс, который должен быть передан итерирующей функции на следующей итерации, т.е. правильно его вызывать нужно примерно как pairs:
|
 |
|
|
smz wrote:z00n
Это уже лучше, но gmatch3 всё ещё не работает.
Странно, на каком тесте?
P.S. Возможно вы потеряли local IMPOSSIBLE_INDEX = math.pi - отредактирую исходник
|
 |
|
|
smz wrote:z00n
Попробуй string.gmatch, а затем обе свои по очереди.
Второй тест. Оказалось, что string.find, если паттерн матчится с empty string (например "%w*" или ".?"), ведет себя контринтуитивно (string.gmatch, кстати, тоже - string.gmatch("aaa","%w*") матчится 2 раза, а не интуитивный 1). Я не видел где это документировано, и собственно в изначальном коде меня и заинтересовало зачем там столько заплаток типа limit=1+#subj и start = (e < s) and s+1 or e+1.
Итак если (e < s) то:
а) мы сматчили пустую строку
б) нам нужно выйти из следующего цикла
Код с заплатками:
|
 |
|
|
По моему можно слегка упростить. Где был бесконечный цикл?
|
 |
|
|
Вообще, конечно полезно знать как писать итераторы.
Итератор для generic for это функция, которая возвращает 3 значения:
-1- the iterator function;
-2- the invariant state;
-3- the initial value for the control variable.
Iterator function - это грубо говоря функция Next, а 2 и 3 - аргументы для нее, поэтому если ваша Next - stateful, аргументы можно опустить.
Функция Next в свою очередь должна возвращать key-value пару, что легко предположить из того, как мы обычно используем generic for.
Предположим у нас нет string.gmatch, а есть только string.find, тогда:
Чтобы убрать порнографию с PAT можно сделать так:
Stateful итераторы хорошо писать с помощью coroutines.
|
 |
|
|
smz wrote:
z00n wrote:Мне тут попалась под руку утилита UPX ( http://upx.sourceforge.net/) для сжимания бинарников - в результате очередная lua51.dll, размер 49.5 K c парсером.
Только без обиды:
Зачем эти детские игры?
Если это ко мне вопрос, то без понятия - и мне даже не интересно.
|
 |
|
|
|
Мне тут попалась под руку утилита UPX (http://upx.sourceforge.net/) для сжимания бинарников - в результате очередная lua51.dll, размер 49.5 K c парсером.
|
 |
|
|
Scaint wrote:Здравствуйте. Я использую Lua в своем игровом движке. Скрипт вызывается в основном цикле программы, т.е. при рендеринге каждого кадра.
lua_getglobal(ls.State, 'main');
...
lua_pcall(ls.State, ArgCount, 1, 0);
Получается каждый раз происходит поиск функции по имени в таблице глобальных переменных. Это не лучшим образом сказывается на производительности, особенно при большом количестве переменных.
Поиск в таблице по имени занимает ~ 30 наносекунд. Поскольку это hash-таблица, то сложность O(1) - т.е. не зависит от количества глобальных переменных.
Scaint wrote:У меня возник вопрос, можно ли вызывать функцию скрипта по заранее полученому индексу или адресу?
Да, конечно см. luaL_ref, как пользоваться написано в PIL: http://www.lua.org/pil/27.3.2.html
|
 |
|
|
smz wrote:
Но корректно работать не будет, так как:
1. Ф-ции lua_loadfile не существует - есть ...
Спасибо, это я спросонья
Вот, написал на PB упрощенный вариант - работает совершенно корректно, откопилированный вариант для экспериментов прилагается.
|
 |
|
|
Я не знаю PowerBasiс'а, но с точки зрения API такой код должен работать корректно
|
 |
|
|
jangle wrote:
Проблема частично устранилась заменой Lua.dll на новую версии 5.1.3
Частично, потому что на вершине стека все-таки стали появлятся сообщения об ошибках, однако например в таких случаях:
выдается неинформативная строка
attempt to call a nil value
Нет номера строки с ошибкой!
Странно, здесь нет попытки вызова nil value - здесь мы имеем банальную синтаксическую ошибку - expression in statement position.
Вот что говорит интерпретатор lua:
Т.е. луа ожидает , и заметьте, номер строки выводится.
А ваше сообщение attempt to call a nil value скорее всего относится к способу, которым вы обрабатываете ошику.
Приведите код, которым вы вызываете луа.
|
 |
|
|
al wrote:
Strijar wrote:http://luaforge.net/projects/luaposix/
Сдается мне что библиотека совсем не адаптирована под win32.
Звучит довольно забавно, поскольку POSIX совместимость и есть коренное отличие WIN ot *NIX Практически единственный способ заставить заработать posix программу под win - Cygwin - т.е вы должны скомпилировать ее Cygwin версией gcc и таскать с собой мегабайтную cygwin1.dll.
Но если вам просто нужен sleep под win32 то нужно как-то так:
|
 |
|
|
|
|