Здравствуйте, netch80, Вы писали:
N>Здравствуйте, Рысцов Денис, Вы писали:
РД>>Здравствуйте, Сергей, Вы писали:
С>>>Лично я считаю, что Tcl/Tk мёртв и практически невостребован ... Если ориентироваться только на Windows, то можно вместо скриптов выбрать C# и писать нужное на нём. .Net сегодня это одна из наиболее востребованных платформ.
РД>>Tcl только кажется мертвым, работая в мотороле и компании, занимающейся ip-телефонией, работал на tcl — в первой пришлось его изучить, так как занимался поддержкой существующего кода,
N>Кошку программировать? Да, там он незаменим. В остальном смысла в нём таки мало.
Не только кошку. Tcl — scripting language of choice много где. На вскидку — ANSYS, Ixia, Agilent. Ну и cisco, где tcl не уже ограничивается IVR-скриптами, а метастазировал в общий язык автоматизации на сетевом элементе.
Год назад потребовалось добавить в существующую C++ программу (мат. моделирование) скрипты. Искал скриптовый движок по следующим критериям:
— умеет встраиваться в программу (на уровне бибиотеки или исходного кода, я использую последнее);
— набор встроенных команд может расширяться процедурами, написанными на C/C++;
— кроссплатформенный (точнее, Linux + Windows);
— наличие стандартной библиотеки, в частности: статистика, работа со списками, работа с файлами.
Ничего лучшего Tcl не нашёл. Теперь в моей программе критические по времени функции написаны на C++, а разнообразная обвязка и логика эксперимента — на Tcl. Я, правда, использую минимум от возможностей Tcl, но мне пока хватает, а само наличие возможностей (например, полноценные сетевые функции) греет душу.
MC>Раз Вы знакомы с tcl/tk — может, ответите на мой вопрос? В чем их объективные преимущества перед python+wx,
Я вот могу сказать за WX. Дизайн WX чрезвычайно напоминает дизайн MFC, и что-либо писать на ней крайне неприятно.
Таже FLTK гораздо приятнее, рискну предположить, что на Tcl/Tk все это получится еще менее многословно и меньшим
количеством ненужных деталей.
MC>например. Или хотя бы в чем преимущество tk перед другими гуями? Перед gtk, например. Или перед wx. У меня сложилось ощущение, что Tk чем-то хорош, MC>но чем — я так и не понял.
wx — вовсе не подарок. Его главное преимущество в том, что он использует нативные контролы под каждой платформой, чего не скажешь ни о GTK ни о Qt.
Плюс лицензия LGPL. Так что иногда это просто единственный выход.
MC>>Раз Вы знакомы с tcl/tk — может, ответите на мой вопрос? В чем их объективные преимущества перед python+wx, например.
dmz>И кстати, DSL на питоне делаются очень плохо. Почти никак не делаются.
То, что сайт лежит, это само по себе плохо. Но думаю, что DSL на самом языке, в стиле Хаскелла или Руби, на питоне не сделать, синтаксис языка много не позволит.
Одно из лучших приближений к DSL, что я видел — в проекте FacesPM. Там они задают структуру проекта в виде питоновских структур — например, так:
def task1():
name = "Треп в форуме"
start = "2009-03-17 07:00"
duration = "1h"def task2():
name = "Завтрак"
depends = [task1] # условно, тут не помню
и используют сам питон, что бы это разобрать и построить дерево заданий. Но это не настоящий DSL на самом языке — тут они таким образом просто съэкономили на парсере (обалдеть экономия). Т.е. они разбирают питоном этот код, совершенно бессмысленный, как программа, самим питоном, строят какое-то дерево, и потом его обсчитывают. Сам этот код не запускается и не выполняется.
В "настоящем" же "внутриязыковом" DSL — этот код бы исполнялся и приводил к построению дерева и/или еге пересчету.
В стиле Ruby: http://code.activestate.com/recipes/534150/
dmz>В "настоящем" же "внутриязыковом" DSL — этот код бы исполнялся и приводил к построению дерева и/или еге пересчету.
dmz>>В "настоящем" же "внутриязыковом" DSL — этот код бы исполнялся и приводил к построению дерева и/или еге пересчету.
KV>Есть неплохая презенташка, описывающая возможности python по реализации встроенного DSL: http://media.brianbeck.com/files/Python_DSLs_I.pdf
KV>Так что, по-моему, в пайтоне все не так уж и плохо
Хороший DSL не должен быть засорен артефактами своего host-языка, потому что пользователь этого DSL не обязан знать хост-язык. Грубо говоря, на питоне есть примерно два подхода к "внутренним" DSL — на уровне классов и на уровне (перегруженных) операторов. Можно как-то объединить.
Перегруженные операции еще где-то как-то катят в конструировании SQL запросов, как это сделано в SQLAlchemy. Но для описания какой-нибудь предметной области уже как-то не очень.
Ну возьму вот из нашего тулкита описание web-форм, по моему хороший пример, демонстрирует оба подхода сразу, и я думаю, это близко к пределу того, что можно сделать на самом питоне:
# строим валидатор запроса:class add_trip_rq(object):
trip_name = not_empty()¬_space()&has_len(max=200, min=0)
planned_start_date = is_date() & not_empty()
planned_start_hour = is_int() & not_empty() & less(24)
planned_start_minute = is_int() & not_empty() & less(60)
planned_length = time_shift() & not_empty()
route_id = is_int() & not_empty()
obj_id = is_int() & not_empty()
max_speed_inst = is_float()
min_speed_avg = is_float()
max_temperature = is_float()
min_temperature = is_float()
# используем валидатор запроса (это что бы было понятно, зачем все это):
@render(raw=True)
@permission('Edit trip')
@validate_form(add_trip_rq) # вот тут оно проверится, и отстрелит ошибку, так что можно в коде даже не заморачиваться.def do_add_trip(self):
fd = Form_Data(self.request.form)
fe = Form_Errors(self.form_errors)
# бла-бла-бла
Теперь разбираем пример:
class add_trip_rq(object) <- засоренность артефактами языка. Что такое вообще class, object ? WTF?
trip_name = not_empty() & not_space() & has_len(max=200, min=0) # <- довольно логично, но присутствуют артефакты - () - вызов функций.
Как надо (условно, ну допустим DSL имеет близкий к питону, двухмерный синтаксис):
request add_trip:
field trip_name : string & not_empty & not_space & (length > 0 & length < 200)
# ну и так далее
Конечно, тут в силу простоты предметной области, хилость питона не так уж очевидна. Но в более сложных случаях, как например, описание структуры проекта — все это вылазит в полный рост.
Руби я привел как пример языка, про который я думал, что там с этим все хорошо или хотя бы нормально. Знаю Руби я крайне плохо, так что мог быть оо нем лучшего мнения, чем оно того заслуживает. Если то, что получается в руби, не сильно лучше того, что имеется в питоне — ну тем хуже для руби, что я могу сказать.
В пайтоне все плохо. Мало того, что выразительность принесена в жертву производительности, так жертвы не хватило, достаточно посмотреть на
lua + metalua что бы это понять.
Здравствуйте, dmz, Вы писали:
dmz>В пайтоне все плохо. Мало того, что выразительность принесена в жертву производительности, так жертвы не хватило, достаточно посмотреть на
Есть подозрения что ты не докурил до метаклассов и модулей compile и co
dmz>lua + metalua что бы это понять.
dmz>>В пайтоне все плохо. Мало того, что выразительность принесена в жертву производительности, так жертвы не хватило, достаточно посмотреть на
FR>Есть подозрения что ты не докурил до метаклассов и модулей compile и co
Да ну что ты. Докурил. У нас на них AOP, когда декораторов не хватает. Только метаклассы они не совсем про DSL.
Собсно, кусок из приведенного ранее валидатор-генератора:
class validator(object):
__metaclass__ = with_error
def is_transform(self):
return False
def transform(self, v):
raise exceptions.NotImplementedError()
# и прочееclass SecTest(Common):
__metaclass__ = Before_After_Call
def __call_before__(self, *args, **kw):
self.__create_env__()
#self.obtain_session()def __call_after__(self, *args, **kw):
self.__clear_env__()
# и так далееdef any_class(name):
o = new.classobj(name, (object,), {'__init__':lambda self,**kw: self.__dict__.update(kw)})
module = inspect.getmodule(o)
if not getattr(module, o.__name__, None):
setattr(module, o.__name__, o)
return getattr(module, o.__name__)
Могу я по этому вопросу быть свободен?
Собственно, над compile я глумился чуть выше, если посмотришь. Да и собственно, что с этого всего? При живом хаскелле, окамле и lua+metalua — что толку в питоне вообще непонятно. У него единственное достоинство что простой и доходчивый. Ну и всё.
Таки я вот тут привел уже несколько примеров DSL — и своих и нет. Самое DSL-ное что видел — это FacesPM. IMHO — все они такие смешные. По сравнени с тем, что (и как) можно сделать на более других языках. Если есть что-то более прикольно сделанное, нежели Faces или SQLAlchemy-like — может, покажите? Это лучше чем намекать на загадочные большие возможности.
FR>Есть не менее достойный http://www.fiber-space.de/EasyExtend/doc/EE.html макросы в стиле немерле.
FR>>>Есть не менее достойный http://www.fiber-space.de/EasyExtend/doc/EE.html макросы в стиле немерле.
dmz>>А это мейнстрим? Или нечто маргинальное?
dmz>Посмотрел, вопрос снят. Неважно. Поздно