LINUX.ORG.RU
ФорумTalks

Факап на факапе

 , ,


0

1

Приложения для линукс — неиссякающий источник еды. Итак, дано: идея написать плагин-калькулятор на Lua для medit. Надо сказать, про Lua я не знаю ровным счётом ничего. Открываю мануалы на Lua и на API редактора, начинаю писать.

line_nr = doc.get_line_at_cursor()
cur_line_end = doc.get_pos_at_line_end(line_nr)
doc.set_cursor_pos(cur_line_end)
doc.insert_text("\n")

text = doc.get_line_text(line_nr)
f = loadstring("return (" .. text .. ")")
result = tostring(f())
doc.insert_text(result)

Проверяем:

20/4
5
Ок.
21/4
5,25
Не ок! Используется десятичный разделитель из локали. А должен — десятичный разделитель ЯП, чтобы потом это число можно было снова интепретатору скормить.

Проверяем:

> os.setlocale("C")
> print(tostring(1.5))
1.5
> os.setlocale("ru_RU.UTF-8")
> print(tostring(1.5))
1,5
Мда.

Копаем сорцы. Находим, что tostring работает через sprintf. sprintf использует десятичный разделитель локали. Курю man sprintf на предмет принудительного использования точки в качестве разделителя. Ничего не накуриваю.

Думаю, ладно — хрен с тобой, золотая рыбка. Подменю локаль прямо в скрипте. Пишем:

line_nr = doc.get_line_at_cursor()
cur_line_end = doc.get_pos_at_line_end(line_nr)
doc.set_cursor_pos(cur_line_end)
doc.insert_text("\n")

text = doc.get_line_text(line_nr)
f = loadstring("return (" .. text .. ")")
result = f()

old_locale = os.setlocale(nil)
os.setlocale("C")

result = tostring(result)

os.setlocale(old_locale)

doc.insert_text(result)

И-и-и-и... обламываюсь! Потому что объект os в API medit-а не входит.

Вот прям даже не знаю, куда репортить это нелепое стечение обстоятельств. Наверное всё-таки в Lua. Ибо какого черта они не дали готовой функции для локаленезависимого преобразования чисел в строки.

Ответ на: комментарий от geekless

Io забыл.

Узнал из треда о новом для себя ЯП.

PolarFox ★★★★★
()
Ответ на: комментарий от Siado

луа удобен тем, что а) минималистичен, в том плане, что в нем нет ничего лишнего, возможностей из коробки по минимуму, и легко встроить в него только ту функциональность что нужна в конкретном продукте б) удобен для встраивания и реально мало весит и реально быстро работает

я сам с ним возился не очень много, но достаточно. впечатления только положительные. Чем он так не нравится то? аргументацию!

wwwsevolod
()
Ответ на: комментарий от PolarFox

плюсуюсь! конечно нету некоторой гибкости js, но этим же он и хорош

wwwsevolod
()

А только одного меня изумляет желание заставить lua выводить данные с точкой в системах, в которых эти данные исходно, ещё до обработки их будущим плагином, будут идти с запятой?

kss ★★★★★
()
Ответ на: комментарий от kss

в которых эти данные исходно, ещё до обработки их будущим плагином, будут идти с запятой?

Что ты курил?

geekless ★★
() автор топика
Ответ на: комментарий от geekless

Ну ты хочешь обрабатывать строку, которую пользователь набрал в текстовом редакторе. И введёт он там 20,4*13,5 и всё, у тебя уже есть запятые-разделители.

kss ★★★★★
()
Ответ на: комментарий от geekless

А что он там должен вводить? Только не говори мне, что ты хочешь заставить его вместо запятых вводить точку.

kss ★★★★★
()
Ответ на: комментарий от kss

Скрипт вычисляет lua-выражение. Еще раз спрашиваю: зачем пользователю пытаться скормить ему бред, который не является lua-выражением?

geekless ★★
() автор топика
Ответ на: комментарий от kss

Хм, а ты что рассчитывал там увидеть? Принципиально новый язык с десятичной запятой? А функции в цацкель-стиле вызывать?

geekless ★★
() автор топика
Ответ на: комментарий от geekless

Я думал увидеть там обработку пользовательского текста (это же плагин для текстового редактора, а не отдельная программа, для которой специальный синтаксис был бы оправдан), чтобы пользователь мог в своем тексте (для каких-то своих странных пользовательских нужд) выделить нужный кусок текста с математическим выражением (и оно, естественно, будет написано как и основной текст, с той же локалью) и получить результат. А иначе какая ему разница: набирать специальное выражение со своим синтаксисом (заодно переключая для себя контекст на тех же разделителях) и вычищать его потом из текста или просто запустить калькулятор и там подсчитать все (ну или во встроенной в текстовый редактор консоли вызвать bc)? Калькулятор ему в таком случае как бы даже не предпочтительней был: там не надо так на синтаксис геморроится и помнить про точки.

kss ★★★★★
()
Ответ на: комментарий от kss

1. Я лично НИКОГДА не использую десятичные запятые в своих текстах. По понятным причинам.

2.

набирать специальное выражение со своим синтаксисом

У любого формализованного языка есть свой специальный синтаксис. Что сказать-то хотел?

Калькулятор ему в таком случае как бы даже не предпочтительней был: там не надо так на синтаксис геморроится и помнить про точки.

Какой синтаксис? Какая разница, в чём синтаксисе считать: в bc или в lua?

geekless ★★
() автор топика
Ответ на: комментарий от geekless

Я лично НИКОГДА не использую десятичные запятые в своих текстах.

Ну то есть ты пишешь плагин исключительно для мутантов, так бы и сказал сразу :)

Что сказать-то хотел?

Я хотел сказать, что вместо обычного текста «учитывая A и B, получаем выражение 12,1*13,7, что равно » пользователю придется писать отдельно этот текст, отдельно выражение для твоего плагина, а затем ещё удалять из текста это отдельное выражение. Ну и какой у него тут PROFIT по сравнению с обычным калькулятором? Зачем ему твой плагин в том виде, который ты задумал?

Какая разница, в чём синтаксисе считать: в bc или в lua?

Вообще-о про синтаксис к калькулятору относилось. Который gnome-calculator или другой подобный. А у bc перед твоим плагином (в задуманном виде) другое преимущество: bc уже написан, отлажен и известен.

kss ★★★★★
()
Ответ на: комментарий от kss

Который gnome-calculator или другой подобный.

facepalm.sh

«Исключительно для мутантов», да. Только мутантам может прийти в голову в КОМПЬЮТЕРЕ пользоваться эмулятором аппаратного КАЛЬКУЛЯТОРА.

Ну и какой у него тут PROFIT по сравнению с обычным калькулятором? Зачем ему твой плагин в том виде, который ты задумал?

Вообще-то я для себя писал. Это ты зашел в тред и пытаешься выдвинуть какие-то требования по юзабилити для «простого пользователя». При чем, ходишь вокруг этих требований, но прямо не называешь. Еще раз говорю: покажи синтаксис выражений, который отвечает твоим требованиям. С BNF знаком?

geekless ★★
() автор топика
Ответ на: комментарий от geekless

Только мутантам может прийти в голову в КОМПЬЮТЕРЕ пользоваться эмулятором аппаратного КАЛЬКУЛЯТОРА.

Знатно передергиваешь. Про мутантов относилось к людям, которые никогда не пользуются десятичным разделителем запятой в текстах, но при этом изменить локаль не хотят и предполагают такое поведение правильным. А ещё немутанты не фыркают на эмуляторы аппаратных терминалов, а пользуются тем, что у них под рукой (а так же откуда смогут скопировать результаты без лишних усилий). Опять же, графический калькулятор шел как один из примеров уже существующих альтернатив твоему плагину.

Это ты зашел в тред и пытаешься выдвинуть какие-то требования по юзабилити для «простого пользователя»

Да ну? А я думал, что я сначала хотел указать тебе на возможный баг, но после того как выяснилось, что это фича, ты уже сам захотел узнать моё мнение о том как было бы правильно. Так чего теперь возмущаешься?

Еще раз говорю: покажи синтаксис выражений, который отвечает твоим требованиям.

Я тебе вроде уже несколько раз говорил, даже пример привел такого текста: обычный естественный текст с математическими выражениями (ну, с учетом естественных ограничений plain text), как дети ручкой в тетрадку в школе пишут. Что непонятного-то?

kss ★★★★★
()
Ответ на: комментарий от kss

Пример (жутко надуманный, конечно): учительница пишет для себя шпаргалку «Дети, вы хотите купить 2,5 кг яблок по цене 49,90 р. Как решить сколько вы должны заплатить? Правильно, надо перемножить два числа. Записывайте у себя в тетрадках 2,5*49,90=». После чего выделяет мышкой это 2,5*49,90, вызывает гипотетический плагин и получает результат, который копирует после равно. Так понятно?

kss ★★★★★
()
Ответ на: комментарий от kss

Я тебе вроде уже несколько раз говорил, даже пример привел такого текста: обычный естественный текст с математическими выражениями (ну, с учетом естественных ограничений plain text), как дети ручкой в тетрадку в школе пишут.

Что такое «обычный естественный текст» и какое он отношение имеет к арифметике? Почему 24,5 * 3 у тебя оказывается «обычным текстом», а 24.5 * 3 — «необычным текстом»?

Дети могут в тетрадке и вот так писать:

1    6
_ +  _
2    7

Что непонятного-то?

Туго же до тебя доходит. Повторяю снова:

«Еще раз говорю: покажи синтаксис выражений, который отвечает твоим требованиям.»

Впрочем, нет. Сначала осиль эти требования сформулировать. «Обычный естественный текст» — это филькина грамота.

geekless ★★
() автор топика
Ответ на: комментарий от kss

Так понятно?

Мне отслюда только одно понятно: ты выделяешь мышкой в тетрадке. Отсыпь, пожалуйста, а то меня так чётко не вставляет своя трава.

Синтаксис есть у твоего «естественного языка»? Или скрипт должен владеть телепатией через libastral?

geekless ★★
() автор топика
Ответ на: комментарий от PolarFox

Хм, а мне хотелось бы калькулятор, который бы в качестве ответа на 1/2 + 6/7 мог дать 1 + 5/14 (или 19/14, по выбору).

Ну так. Готовых движков разве нет?

geekless ★★
() автор топика
Ответ на: комментарий от geekless

У меня давно теплится мысль написать калькулятор моей мечты (натуральные дроби — далеко не самая нужная мне фича, есть идеи интереснее), но что-то всё никак не могу найти одновременно и хорошую арифметическую библиотеку (как арити под жабу), так и хорошую гуёвую библиотеку, где несложно лепить кастомные виджеты, одновременно под один ЯП. Да, вот такой у меня индусский подход.

PolarFox ★★★★★
()
Ответ на: комментарий от geekless

Оно немного путает × и +, а так вполне себе. Правда после попытки написать что-то типа sin(0.5) ждёт облом.

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

Кстати, калькулятор с рациональными дробями, статвычислениями, последовательностями и прочими вкусняшками существует даже в аппаратной реализации. :)
Есть такой девайс, как CASIO fx-82TL и ему подобные. Там даже переменные есть...
Сам таким пользовался на первых курсах универа.

delete83 ★★
()

Вот прям даже не знаю, куда репортить это нелепое стечение обстоятельств. Наверное всё-таки в Lua.

К отсутсвию таблицы os имеют отношения только разработчики medit.

Ибо какого черта они не дали готовой функции для локаленезависимого преобразования чисел в строки.

Будешь послан, я гарантирую это. Батарейки в комплект не входят, идеология такая.

annulen ★★★★★
()
Ответ на: комментарий от annulen

Будешь послан, я гарантирую это. Батарейки в комплект не входят, идеология такая.

Это не батарейки, это core.

geekless ★★
() автор топика
Ответ на: комментарий от PolarFox

Да и с хрена ли им быть, если там нет целых чисел.

geekless ★★
() автор топика

Читаю мануал, натыкаюсь на прекрасное:

Both function calls and vararg expressions can result in multiple values. If a function call is used as a statement (see §3.3.6), then its return list is adjusted to zero elements, thus discarding all returned values. If an expression is used as the last (or the only) element of a list of expressions, then no adjustment is made (unless the expression is enclosed in parentheses). In all other contexts, Lua adjusts the result list to one element, discarding all values except the first one.

Вообще у меня сложилось мнение, что Lua — это личинка PHP. Не вылупившаяся.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

Это как раз более-менее общепринято, даже в лиспе такое есть.

Один из наибольших реальных факапов Lua, которые не спишешь на минималистичность, это непоследовательный type coercion.

Т.е. 1+«1» == 2, но (1 == «1») == false.

Соответственно, и с поиском по таблице та же фигня: 1 и «1» это разные ключи.

Впрочем, насколько я навскидку помню (но не буду настаивать), в js и пыхе всё еще хуже.

Как по мне, так автоприведение чисел к строкам и наоборот надо либо совсем запрещать, либо делать тотально и беспощадно а-ля Tcl.

Vadim_Z
()
Ответ на: комментарий от Vadim_Z

Как по мне, так автоприведение чисел к строкам и наоборот надо либо совсем запрещать, либо делать тотально и беспощадно а-ля Tcl.

Ага.

geekless ★★
() автор топика
Ответ на: комментарий от PolarFox

это да, я патч применял, добавляющий их. Хотя в 5.2 версии вроде добавили.

XVilka ★★★★★
()

Приложения для линукс — неиссякающий источник еды.

Это ты так вбрасываешь или действительно веришь, что в приложениях для других ОС не бывает проблем с локалями? Я лично вспоминаю Delphi 3, Windows NT 4 и 1999 год.

hobbit ★★★★★
()
Ответ на: комментарий от geekless

В общем, забей: друг другу мы ничего не докажем, а моих объяснений ты почему-то демонстративно понимать не хочешь. Значит, проехали.

kss ★★★★★
()
Ответ на: комментарий от drull

Еще нестрогая типизация.

Будто это что-то плохое для языка, который обычно используется для того, чтобы писать скрипты для игрушек.

PolarFox ★★★★★
()

И-и-и-и... обламываюсь!

Записывай: export LC_NUMERIC=C в ~/.bash_profile

red_eyed_peguin
()
Ответ на: комментарий от PolarFox

Хм, а мне хотелось бы калькулятор, который бы в качестве ответа на 1/2 + 6/7 мог дать 1 + 5/14 (или 19/14, по выбору).

facepalm.sh

Common Lisp так и считает, а из калькуляторов так работает maxima: http://ompldr.org/vZXF1aA.png

drakmail ★★★★
()
Ответ на: комментарий от PolarFox

Это плохо для любого языка. Баги ловить сложнее.

drull ★☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.