| Автор |
Сообщение |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 19/02/2010 13:02:16
|
lexa
Новичок
![[Avatar]](/forum/images/avatar/138bb0696595b338afbab333c555292a.png)
Зарегистрирован: 09/02/2010 15:48:09
Сообщений: 17
Оффлайн
|
Привет.
Прям и не знаю, как сформулировать. Это скорее вопрос о компилируемых языках, с которыми я никогда дела не имел.
Есть у нас Lua. Оригинальный (для винды). Есть исходники. Я кое-что под себя поправил (логику функций luaV_lessthan() lessequal()) и не понимаю, как бы мне эти изменения внести так, чтобы не пришлось пользоваться отдельно скомпилированной версией Lua.
Не понятно, да? :)
На примере Lua. Я осознаю разницу между интерпретируемым и компилируемым языками, пример просто отображает логику.
Файлы file1.lua и file2.lua содержат функции test(). Одна из функций будет перебита другой в зависимости от иерархии вызова файлов.
Вот я этого хочу, чтобы созданный сишный модуль для Lua перебивал функции самой Lua.
Можно так? Или вопрос маразматичный сам по себе (в контексте компилируемых языков)? :)
|
Признанный мастер чинпоко, а-ай ^_^ |
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 19/02/2010 14:35:44
|
XNut
Постоянный посетитель
![[Avatar]](/forum/images/avatar/7f39f8317fbdb1988ef4c628eba02591.jpg)
Зарегистрирован: 15/04/2008 12:12:47
Сообщений: 99
От: Россия, Липецк
Оффлайн
|
Сделайте сравнение через метатаблицы
|
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 19/02/2010 21:46:15
|
z00n
Постоянный посетитель
Зарегистрирован: 15/02/2008 12:15:56
Сообщений: 96
Оффлайн
|
lexa wrote:Привет.
Есть у нас Lua. Оригинальный (для винды). Есть исходники. Я кое-что под себя поправил (логику функций luaV_lessthan() lessequal()) и не понимаю, как бы мне эти изменения внести так, чтобы не пришлось пользоваться отдельно скомпилированной версией Lua.
Хорошего решения тут нет.
Предлагаю зайти с другой стороны - напишите, зачем вам понадобилось исправлять логику luaV_lessthan - а мы подумаем как это обойти.
|
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 20/02/2010 11:13:59
|
lexa
Новичок
![[Avatar]](/forum/images/avatar/138bb0696595b338afbab333c555292a.png)
Зарегистрирован: 09/02/2010 15:48:09
Сообщений: 17
Оффлайн
|
XNut, __lt(), и __le() не вызываются, если метатаблицы не совпадают. А они не совпадают... точнее, они совпадают только, когда сравниваемые типы идентичны.
z00n, вы будете смеяться. :) Я - пхпшник. Для меня игра типов это песня. Сон, который я осознаю и контролирую. Понимаю, многие предпочитающие иные языки не понимают той свободы, которую даёт PHP. Осуждают факт, что false + 1 == 1 (т.е. 0 + 1), а не ошибка. Да что там. Они не понимают для чего есть операторы == и ===, ведь == должно хватить. :)
Но мне PHP этим очень нравится. Да, надо постичь логику языка, его поведение, его идею. Но это ведь не делает язык плохим. Сишники, наприаер, рулят памятью и ошибка 500 при написании программ для веба их любимая ошибка. :) Людям предпочитающим языки повыше это не понять.
Я же хочу настроить Lua под себя - под похапешника. Поэтому думаю, что вы будете смеяться.
Есть файл lvm.c, в нём функции вызываемые при использовании оператором < и <= в Lua. Так как они почти похожи, то приведу пример функции для оператора < (less than - меньше, чем). Оператор > обрабатывается так же через эту функцию, только аргументы идут в обратном порядке.
Я замнил это
этим
Очень просто. Не нарушает код модулей на самой Lua, ведь они написаны с учётом типов. Но в своём коде можно это игнорировать.
Рядышком в топике мне подсказали, как можно навешать метатаблицы к готовым типам данных. И все данные идут через моё описание ('' + 1 = 1, true + 1 = 2 и т.д.).
Но вот как залезть в глубины, изменить их и не компилировать свой версии интерпретатора - вопрос.
Вооот. :)
|
Признанный мастер чинпоко, а-ай ^_^ |
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 20/02/2010 12:11:46
|
z00n
Постоянный посетитель
Зарегистрирован: 15/02/2008 12:15:56
Сообщений: 96
Оффлайн
|
lexa wrote:
z00n, вы будете смеяться. :) Я - пхпшник. Для меня игра типов это песня. Сон, который я осознаю и контролирую. Понимаю, многие предпочитающие иные языки не понимают той свободы, которую даёт PHP. Осуждают факт, что false + 1 == 1 (т.е. 0 + 1), а не ошибка. Да что там. Они не понимают для чего есть операторы == и ===, ведь == должно хватить. :)
Настоящую свободу дает Lisp. А в любом современном статически типизированном языке (Haskell, Ocaml, SML, Scala etc.) вы можете переопределять операторы.
lexa wrote:
Очень просто. Не нарушает код модулей на самой Lua, ведь они написаны с учётом типов. Но в своём коде можно это игнорировать.
Рядышком в топике мне подсказали, как можно навешать метатаблицы к готовым типам данных. И все данные идут через моё описание ('' + 1 = 1, true + 1 = 2 и т.д.).
Но вот как залезть в глубины, изменить их и не компилировать свой версии интерпретатора - вопрос.
Никак, вам придется перекомпилировать интерпретатор. Но есть неплохой шанс на то, что изменение, подобное вашему, войдет в lua 5.2 (которая не за горами):
http://article.gmane.org/gmane.comp.lang.lua.general/63208
|
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 21/02/2010 06:40:51
|
lexa
Новичок
![[Avatar]](/forum/images/avatar/138bb0696595b338afbab333c555292a.png)
Зарегистрирован: 09/02/2010 15:48:09
Сообщений: 17
Оффлайн
|
z00n wrote:Настоящую свободу дает Lisp
К Lisp я два подхода делал, не вышло пока познакомится нормально. Пугает меня этот язык. :)
z00n wrote:А в любом современном статически типизированном языке (Haskell, Ocaml, SML, Scala etc.) вы можете переопределять операторы.
Не, операторы я привёл как пример немного странной логики PHP. === это == со сравнением типов. Например, в Lua число 2 не равно строке с содержанием 2. В PHP они равны.
Жаль. Значит буду компилировать свою Lua с блэк-джеком и шлюхами. :)
|
Признанный мастер чинпоко, а-ай ^_^ |
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 21/02/2010 11:01:54
|
z00n
Постоянный посетитель
Зарегистрирован: 15/02/2008 12:15:56
Сообщений: 96
Оффлайн
|
lexa wrote:
z00n wrote:Настоящую свободу дает Lisp
К Lisp я два подхода делал, не вышло пока познакомится нормально. Пугает меня этот язык. :)
По моему - это самый простой язык на свете, особенно если начинать со Scheme :)
lexa wrote:
z00n wrote:А в любом современном статически типизированном языке (Haskell, Ocaml, SML, Scala etc.) вы можете переопределять операторы.
Не, операторы я привёл как пример немного странной логики PHP. === это == со сравнением типов. Например, в Lua число 2 не равно строке с содержанием 2. В PHP они равны.
Я имел в виду, что в вышеприведенных языках такой оператор со странной логикой легко добавить. Допустим возьмем Scala (www.scala-lang.org), а новый оператор для простоты, наоборот, назовем "===":
Загружаем и смотрим:
Вам ведь примерно этого и хотелось: импортировал модуль - изменил логику сравнений?
Это сообщение было редактировано 1 раз. Последнее обновление произошло в 21/02/2010 11:49:36
|
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 23/02/2010 08:27:10
|
lexa
Новичок
![[Avatar]](/forum/images/avatar/138bb0696595b338afbab333c555292a.png)
Зарегистрирован: 09/02/2010 15:48:09
Сообщений: 17
Оффлайн
|
z00n wrote:Вам ведь примерно этого и хотелось: импортировал модуль - изменил логику сравнений?
Ага, так.
Жаль, что языки со статической типизацией - языки со статической. Лучше уж своя версия Lua и ковыряки в Си. :)
P.S. Scala тако-о-ой Java.
|
Признанный мастер чинпоко, а-ай ^_^ |
|
|
 |
|
|
|
|