Здравствуйте, Mamut, Вы писали:
Q>>Все было изобретено вместе с Лисп. То, что ты хочешь, это сложные макросы, которые есть в Лиспе. Я не хочу сказать, что они используются именно так, как ты сказал, но реализовать с их помощью такую схему довольно просто.
M>Пример для CLSQL: M>
Тут возникает небольшой ньюанс. Используя Common SQL мы так и не уходим от синтаксиса LIST, который, как мне кажется, уступает стандартному синтаксису SQL. Например, необходимость квотирования нужных фрагментов, запись арифметических выражений и т. д. Скажем последний select как для меня гораздо более вразумительнее выглядит в виде:
select customer, item, quantity from header, detail where header_id = detail_id
Вопрос не в том, можно или нельзя это реализовать средствами языка. Вопрос в том, чтобы это можно было реализовать в наиболее элегантной форме. Если взять тот же синтаксис MATLAB, то любому выражению мз него можно записать аналог на C++. Но читабельность (восприятие) этого аналога будет сложнее. Например, двоеточие мы вынуждены будем заменить на некоторую константу, для оперций .* и .+ у нас не найдется операторов, ... Записывая это в LISP-е мы уйдем от привычной записи, когда одну формулу можно охватить одним взглядом без разбора нагромождения из скобочек, ...
M>Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования? Т. е. написал плагин --- получил некое расширение языка... Что по вашему мнению, является "лишним" в любимых Вами языках программирования, что бы можно было заменить такими плагинами? Какими свойствами должен обладать "минимальный" язык? Насколько вы допускаете для себя идею начинать каждый конкретный с адаптации конкретного языка программирования под нужды проекта? Пугает ли вас то, что в крупном проекте может использоваться несколько адаптаций (каждся для своей части)?
Этому "плагиновому" языку скоро исполнится 50 лет.
Называется Лисп.
Здравствуйте, eao197, Вы писали:
aik>>Шаблоны — кроме как в STL, слабо понятно зачем нужны. Все можно делать без них, что доказывает Java сообщество изо дня в день. E>Настолько хорошо доказывает, что generic-и были таки добавлены в Java 1.5.
Я даже не знаю чего это такое Но добавили (я думаю) скорее из-за пиара "мы ничем не хуже дотнета" (в дотнете уже есть шаблоны?), чем из-за того что это хорошая и полезная фича.
Здравствуйте, dshe, Вы писали:
R>>Компилятору метаязыка :) R>>Я озвучу еще раз: лисповские макросы — это средство расширения компилятора. R>>С помощью его макросов можно заставить компилятор лиспа компилировать код на С++ или Обероне в Lisp VM D>И что, неужели все это можно сделать без Lots of Irritating Superfluous Parentheses? :)
эти Irritating Superfluous Parentheses в лиспе лишь показывают _во что_ парсятся программы.
А из чего — не имеет никакого значения.
Чтобы указать из чего — достаточно написать макрос.
Претензии к скобочкам есть только у тех, кто не пробовал нормально на лиспе программировать.
если они такие irritating, то откуда берется вся эта любовь к лиспу у тех, кто попрограммировал на нем хотя бы немного.
код на _стандартном_ Common Lisp, использующий встроенный макрос (loop):
(loop for i from 1 to 100
if (evenp i)
minimize i into min-even and
maximize i into max-even and
unless (zerop (mod i 4))
sum i into even-not-fours-total
end
and sum i into even-total
else
minimize i into min-odd and
maximize i into max-odd and
when (zerop (mod i 5))
sum i into fives-total
end
and sum i into odd-total
do (update-analysis min-even
max-even
min-odd
max-odd
even-total
odd-total
fives-total
even-not-fours-total))
Вот читаешь ветки: чего не хватает, чего не хватает... А почему никто не спросит: что лишнего?
Когда Д. Кнут разрабатывал систему TeX, то впоследствии честно признавался, что ставил своей целью написать программу, которая бы удовлетворила бы 95% процентов пользователей. Как он предполагал, остальные 5% пользователей просто внесут извенения в исходный текст TeX так, чтобы он поддерживал необходимые возможности (например, сочетание английского (слева направо) и арабского (справа налево) языков, ...)
Случилось однако так, что в саму систему TeX никто изменений вносить не стал, и Леймпорт при разработке LaTeX использовал только средства самого TeX.
Я иногда мечтаю о некоторой подобной схеме... Если у меня математическое приложение, то даже с учетом перегрузки операций библиотека для работы с матрицами будет, как мне кажется, уступать специализированым возможностям MATLAB. Получается что перегрузка операций лучше чем ничего, но занимает как бы промежуточную нишу. В ряде приложений она не нужна, в ряде приложений лучше MATLAB и где-то посередке располагается библиотека для работы с матрицами с использованием перегруженых операций. Или другой пример. При разработке приложений, работающих с БД, часто не хватает возможности элегантно встроить SQL-операторы в используемый язык программирования. Скажем синтаксис
function GroupSize(GroupId: Integer): Integer;
sql
SELECT COUNT(*) FROM STUDENTS WHERE GROUP_ID = GroupId
end;
был бы намного полезнее, чем возможность ассемблерных вставок. И т. д. и т. п.
Реализовать это можно было бы как некую надстройку, позволяющую добавлять свой язык для блоков кода (asm..end, sql..end, math..end, ...). Вот собственно и все.
Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования? Т. е. написал плагин --- получил некое расширение языка... Что по вашему мнению, является "лишним" в любимых Вами языках программирования, что бы можно было заменить такими плагинами? Какими свойствами должен обладать "минимальный" язык? Насколько вы допускаете для себя идею начинать каждый конкретный с адаптации конкретного языка программирования под нужды проекта? Пугает ли вас то, что в крупном проекте может использоваться несколько адаптаций (каждся для своей части)?
aik wrote:
> M>>Вот читаешь ветки: чего не хватает, чего не хватает... А почему > никто не спросит: что лишнего? > _W>RAII в С++ совершенно лишний. Потому что каждая компания пишет свой > Reflection и RAII. > А что такое "RAII"?
Resource Acquisition Is Initialization — захват ресурсов производится в
конструкторе, а их освобождение в деструкторе. Благодаря
детерминированности C++ у нас получается удобное средство управления
дефецитными ресурсами (сетевыми соединениями, курсорами в БД и т.п.).
Здравствуйте, dshe, Вы писали:
D>Здравствуйте, aik, Вы писали:
aik>>Здравствуйте, eao197, Вы писали:
aik>>>>Шаблоны — кроме как в STL, слабо понятно зачем нужны. Все можно делать без них, что доказывает Java сообщество изо дня в день. E>>>Настолько хорошо доказывает, что generic-и были таки добавлены в Java 1.5. :)
aik>>Я даже не знаю чего это такое :) Но добавили (я думаю) скорее из-за пиара "мы ничем не хуже дотнета" (в дотнете уже есть шаблоны?), чем из-за того что это хорошая и полезная фича.
D>Мысли о том, чтобы добавить Generics в Java, появилась давным давно. Дальним прототипом Java 5 был язык Pizza. И на него оказал влияние отнюдь не C#, а скорее C++ (хотя generics сильно отличаются от C++ template).
Нет, на Pizza оказали влияние ML и Haskell
Особенно, если учесть кто его авторы.
Здравствуйте, Mystic, Вы писали:
M>Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования?
Никак не жизнеспособная. Даже для одного популярного довольно жестко стандартизированного языка есть куча несовместимых компиляторов. Run-time плагины рулят.
Здравствуйте, Mystic, Вы писали:
M>Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования? Т. е. написал плагин --- получил некое расширение языка... Что по вашему мнению, является "лишним" в любимых Вами языках программирования, что бы можно было заменить такими плагинами? Какими свойствами должен обладать "минимальный" язык? Насколько вы допускаете для себя идею начинать каждый конкретный с адаптации конкретного языка программирования под нужды проекта? Пугает ли вас то, что в крупном проекте может использоваться несколько адаптаций (каждся для своей части)?
Ты об Intentional Programming?
К тому в общем-то оно и идет. Хотя и ооочень медленно.
Здравствуйте, aik, Вы писали:
aik>>>Поооонял Тогда согласен с _Winnie, ненужная штука. Деструкторы — это да, тема. D>>Так это ж и есть RAII! И ничего в C++ реализовывать не надо, оно там и так есть. Или теперь я чего-то не понял?
aik>Ты нить потерял Мы тут обсуждаем чего лишнего есть в c++. Там еще лишний RTTI и исключения, ну имхо.
А еще классы, шаблоны, ссылки (чем там еще он от C отличается)
Ребята, если вам достаточно C, то пользуйтесь C, зачем же над C++ изголяться.
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
aik>>>>Поооонял Тогда согласен с _Winnie, ненужная штука. Деструкторы — это да, тема. D>>>Так это ж и есть RAII! И ничего в C++ реализовывать не надо, оно там и так есть. Или теперь я чего-то не понял? aik>>Ты нить потерял Мы тут обсуждаем чего лишнего есть в c++. Там еще лишний RTTI и исключения, ну имхо. E>А еще классы, шаблоны, ссылки (чем там еще он от C отличается)
Cсылки — да, вполне можно выкинуть, но это очень мелкая фича на самом деле.
С классами — нынче очень уж навороченные схемы с наследованиями, виртуальностью и прочим хламом, можно было б почистить.
Шаблоны — кроме как в STL, слабо понятно зачем нужны. Все можно делать без них, что доказывает Java сообщество изо дня в день. Даже множественного наследования чаще всего не нужно.
E>Ребята, если вам достаточно C, то пользуйтесь C, зачем же над C++ изголяться.
Си экстремально убог и нестрог. Изголяются как раз на C++, делая из него универсальный супер мега перегруженный язык, компилятор к которому так и не написан на все 100%.
_Winnie wrote: > >>> M>>Вот читаешь ветки: чего не хватает, чего не хватает... А почему >>> никто не спросит: что лишнего? >>> _W>RAII в С++ совершенно лишний. Потому что каждая компания пишет свой >>> Reflection и RAII. > > Убейте меня! Я опечатался! > Вот что я хотел напечатать: > *RTTI*в С++ совершенно лишний. Потому что каждая компания пишет свой > Reflection и *RTTI* под свои цели.
Он там не то, чтобы лишний. Он там совершенно unusable. Причем настолько
unusable, что самодельный reflection/RTTI даже не может опираться на
родной как на основу, и существует совершенно независимо от него...
function GroupSize(GroupId: Integer): Integer;
M>sql
M> SELECT COUNT(*) FROM STUDENTS WHERE GROUP_ID = GroupId
M>end;
В общем-то проблема рещена миллион лет назад в ембеддед sql.
Выглядеть буджет где-то так (100% не уверен, давно таким не занимался):
function GroupSize(GroupId: Integer): Integer;
sql
BEGIN_SQL
SELECT COUNT(*) FROM STUDENTS WHERE GROUP_ID = GroupId TO :GroupId
END_SQL
end;
Реализуется посредством препроцессора который код между BEGIN_SQL/END_SQL парсит и преобразует в вызовы
соответстсвующей либы. Было такое в интербейзе для С (может и в других бд/языках — не интересовался).
Здравствуйте, Mystic, Вы писали:
>Реализовать это можно было бы как некую надстройку, позволяющую добавлять свой язык для блоков кода (asm..end, sql..end, math..end, ...). Вот собственно и все.
M>Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования? Т. е. написал плагин --- получил некое расширение языка... Что по вашему мнению, является "лишним" в любимых Вами языках программирования, что бы можно было заменить такими плагинами? Какими свойствами должен обладать "минимальный" язык? Насколько вы допускаете для себя идею начинать каждый конкретный с адаптации конкретного языка программирования под нужды проекта? Пугает ли вас то, что в крупном проекте может использоваться несколько адаптаций (каждся для своей части)?
Все было изобретено вместе с Лисп. То, что ты хочешь, это сложные макросы, которые есть в Лиспе. Я не хочу сказать, что они используются именно так, как ты сказал, но реализовать с их помощью такую схему довольно просто.
Опять же, специальные средства OCaml также позволяют достичь этой цели.
Идеальный язык для таких целей — расширенное лямбда исчисление. Оно довольно просто (есть всего несколько сущностей) и вместе с тем черезвычайно эффективно. Собственно, Haskell транслирует сначала свой достаточно сложный синтаксис в промежуточную форму примерно такого вида. Я надеюсь, когда — нибудь будет создана .Functional по аналогии с .NET.
Что касается адаптации языка к проекту, то это тоже к Лисп. Он для этого идеален.
Здравствуйте, jedi, Вы писали: J>Реализуется посредством препроцессора который код между BEGIN_SQL/END_SQL парсит и преобразует в вызовы J>соответстсвующей либы. Было такое в интербейзе для С (может и в других бд/языках — не интересовался).
Вообще вроде как это является соответствующей частью стандарта SQL. Я не помню точную аббревиатуру. Но возможность встраивать SQL прямо в текст программы была рассмотрена уже очень давно. На практике эта техника так и не прижилась — я точно не знаю, почему. То ли потому, что не позволяет строить динамические запросы, то ли еще что-то мешает.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Q>Все было изобретено вместе с Лисп. То, что ты хочешь, это сложные макросы, которые есть в Лиспе. Я не хочу сказать, что они используются именно так, как ты сказал, но реализовать с их помощью такую схему довольно просто.
Здравствуйте, reductor, Вы писали:
R>Этому "плагиновому" языку скоро исполнится 50 лет. R>Называется Лисп.
Представления о LISP-е у меня как раз 50-ти летней давности. Программа состоит из списков, первый элемент списка есть название функции, вторые ее аргументы, ... Как, например, встроить в LISP тот же язык SQL я не вижу
Здравствуйте, Mystic, Вы писали:
M>Здравствуйте, reductor, Вы писали:
R>>Этому "плагиновому" языку скоро исполнится 50 лет. R>>Называется Лисп.
M>Представления о LISP-е у меня как раз 50-ти летней давности. Программа состоит из списков, первый элемент списка есть название функции, вторые ее аргументы, ... Как, например, встроить в LISP тот же язык SQL я не вижу
Здравствуйте, _Winnie, Вы писали:
M>>Вот читаешь ветки: чего не хватает, чего не хватает... А почему никто не спросит: что лишнего?
_W>RAII в С++ совершенно лишний.
И как же в C++ без RAII? А что взамен?
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, jedi, Вы писали:
J>В общем-то проблема рещена миллион лет назад в ембеддед sql. J>Выглядеть буджет где-то так (100% не уверен, давно таким не занимался):
Речь идет совсем не о встраивании SQL-кода в код программы. Речь идет о том, чтобы предоставлять пользователю расширять язык программирования под конкретные задачи. Хотя бы, допустим, язык для реализации таких препроцессоров.
Здравствуйте, _Winnie, Вы писали:
M>>Вот читаешь ветки: чего не хватает, чего не хватает... А почему никто не спросит: что лишнего? _W>RAII в С++ совершенно лишний. Потому что каждая компания пишет свой Reflection и RAII.
Здравствуйте, Mystic, Вы писали: M>Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования? Т. е. написал плагин --- получил некое расширение языка... Что по вашему мнению, является "лишним" в любимых Вами языках программирования, что бы можно было заменить такими плагинами? Какими свойствами должен обладать "минимальный" язык? Насколько вы допускаете для себя идею начинать каждый конкретный с адаптации конкретного языка программирования под нужды проекта? Пугает ли вас то, что в крупном проекте может использоваться несколько адаптаций (каждся для своей части)?
Я слышал про похожий язык программирования — TCL (ещё известно сочетание TCL/TK — вместе с GUI библиотекой). В TCL даже для математических формул отдельный синтаксис, не встроенный в язык. Нет встроенных массивов. Но больше ничего сказать не могу, близко не знаком. На мой взгляд, ничего интересного у них не получилось.
M>Тут возникает небольшой ньюанс. Используя Common SQL мы так и не уходим от синтаксиса LIST, который, как мне кажется, уступает стандартному синтаксису SQL. Например, необходимость квотирования нужных фрагментов, запись арифметических выражений и т. д. Скажем последний select как для меня гораздо более вразумительнее выглядит в виде:
M>
select customer, item, quantity from header, detail where header_id = detail_id
Тогда можно запутаться в том, что есть язык, а что является настройкой к нему. Тот же CLSQL, возможно, можно было сделать в стиле LOOP
(loop with a = 1
with b = (+ a 2)
with c = (+ b 3)
return (list a b c))
(loop while (hungry-p) do (eat))
(loop until (not (hungry-p)) do (eat))
(loop for i fixnum from 3
when (oddp i) collect i
while (< i 5))
(loop for i from 1 to 10
thereis (> i 11)
finally (print i))
и так далее..
С другой стороны, а нужна ли нам такая выразительность? Когда не понятно — что код, а что — ждополнительные конструкции языка
Здравствуйте, Mystic, Вы писали:
M>Тут возникает небольшой ньюанс. Используя Common SQL мы так и не уходим от синтаксиса LIST, который, как мне кажется, уступает стандартному синтаксису SQL.
M>Вопрос не в том, можно или нельзя это реализовать средствами языка. Вопрос в том, чтобы это можно было реализовать в наиболее элегантной форме. Если взять тот же синтаксис MATLAB, то любому выражению мз него можно записать аналог на C++. Но читабельность (восприятие) этого аналога будет сложнее. Например, двоеточие мы вынуждены будем заменить на некоторую константу, для оперций .* и .+ у нас не найдется операторов, ... Записывая это в LISP-е мы уйдем от привычной записи, когда одну формулу можно охватить одним взглядом без разбора нагромождения из скобочек, ...
For a long time there's been a style of software development that seeks to describe software systems using a collection of domain specific languages. You see this in the Unix tradition of 'little languages' which generate code via lex and yacc; you see it in the Lisp community with languages developed inside Lisp, often with the help of Lisp's macros. Such approaches are much liked by their advocates, but this style of thinking hasn't caught on as much as many of these people would like.
In the last few years there's been an attempt to support this style of development through a new class of software tool. The earliest and best known of these is Intentional Programming — originally developed by Charles Simonyi while at Microsoft. However there are other people doing similar things too, generating enough momentum to create some interest in this approach.
Здравствуйте, Cyberax, Вы писали:
>> M>>Вот читаешь ветки: чего не хватает, чего не хватает... А почему >> никто не спросит: что лишнего? >> _W>RAII в С++ совершенно лишний. Потому что каждая компания пишет свой >> Reflection и RAII. >> А что такое "RAII"? C>Resource Acquisition Is Initialization — захват ресурсов производится в C>конструкторе, а их освобождение в деструкторе. Благодаря C>детерминированности C++ у нас получается удобное средство управления C>дефецитными ресурсами (сетевыми соединениями, курсорами в БД и т.п.).
Поооонял Тогда согласен с _Winnie, ненужная штука. Деструкторы — это да, тема.
Здравствуйте, Mamut, Вы писали:
M>>Тут возникает небольшой ньюанс. Используя Common SQL мы так и не уходим от синтаксиса LIST, который, как мне кажется, уступает стандартному синтаксису SQL. Например, необходимость квотирования нужных фрагментов, запись арифметических выражений и т. д. Скажем последний select как для меня гораздо более вразумительнее выглядит в виде:
M>>
select customer, item, quantity from header, detail where header_id = detail_id
M>Тогда можно запутаться в том, что есть язык, а что является настройкой к нему. Тот же CLSQL, возможно, можно было сделать в стиле LOOP
M>С другой стороны, а нужна ли нам такая выразительность? Когда не понятно — что код, а что — ждополнительные конструкции языка
Дело в том, что и то, и то код. Только один это General Purpose, а другой Domain Specific. И разделение это довольно условное и оно в общем-то, и не нужно. Разве кого-то смущает, что те функции и классы, которыми вы расширяете язык, выглядят так же, как и функции и классы из стандартной библиотеки?
Нужна ли такая смесь из языков-нотаций? Думаю, нужна. В качестве достоинств можно отметить:
1. возможность правильности использований конструкций Domain Specific нотации так же как и General Purpose. Например, если будет синтаксическая ошибка в SQL запросе, то в большинстве mainstream подходов она проявится в только runtime, хотя могла бы быть обнаружена еще на этапе компиляции. Причем с нормальным Domain Specific диагностическим сообщением.
2. простор для Domain Specific оптимизации. Например, при реализации влоб матриц на C++, умножение и сложение их будет происходить с использованием промежуточной матрицы.
Здравствуйте, aik, Вы писали:
>>> А что такое "RAII"? C>>Resource Acquisition Is Initialization — захват ресурсов производится в C>>конструкторе, а их освобождение в деструкторе. Благодаря C>>детерминированности C++ у нас получается удобное средство управления C>>дефецитными ресурсами (сетевыми соединениями, курсорами в БД и т.п.).
aik>Поооонял Тогда согласен с _Winnie, ненужная штука. Деструкторы — это да, тема.
Так это ж и есть RAII! И ничего в C++ реализовывать не надо, оно там и так есть. Или теперь я чего-то не понял?
Здравствуйте, dshe, Вы писали:
>>>> А что такое "RAII"? C>>>Resource Acquisition Is Initialization — захват ресурсов производится в C>>>конструкторе, а их освобождение в деструкторе. Благодаря C>>>детерминированности C++ у нас получается удобное средство управления C>>>дефецитными ресурсами (сетевыми соединениями, курсорами в БД и т.п.). aik>>Поооонял Тогда согласен с _Winnie, ненужная штука. Деструкторы — это да, тема. D>Так это ж и есть RAII! И ничего в C++ реализовывать не надо, оно там и так есть. Или теперь я чего-то не понял?
Ты нить потерял Мы тут обсуждаем чего лишнего есть в c++. Там еще лишний RTTI и исключения, ну имхо.
Здравствуйте, aik, Вы писали:
aik>Шаблоны — кроме как в STL, слабо понятно зачем нужны. Все можно делать без них, что доказывает Java сообщество изо дня в день.
Настолько хорошо доказывает, что generic-и были таки добавлены в Java 1.5.
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, aik, Вы писали:
aik>Здравствуйте, eao197, Вы писали:
aik>>>Шаблоны — кроме как в STL, слабо понятно зачем нужны. Все можно делать без них, что доказывает Java сообщество изо дня в день. E>>Настолько хорошо доказывает, что generic-и были таки добавлены в Java 1.5.
aik>Я даже не знаю чего это такое Но добавили (я думаю) скорее из-за пиара "мы ничем не хуже дотнета" (в дотнете уже есть шаблоны?), чем из-за того что это хорошая и полезная фича.
Мысли о том, чтобы добавить Generics в Java, появилась давным давно. Дальним прототипом Java 5 был язык Pizza. И на него оказал влияние отнюдь не C#, а скорее C++ (хотя generics сильно отличаются от C++ template).
Здравствуйте, dshe, Вы писали:
aik>>>>Шаблоны — кроме как в STL, слабо понятно зачем нужны. Все можно делать без них, что доказывает Java сообщество изо дня в день. E>>>Настолько хорошо доказывает, что generic-и были таки добавлены в Java 1.5. aik>>Я даже не знаю чего это такое Но добавили (я думаю) скорее из-за пиара "мы ничем не хуже дотнета" (в дотнете уже есть шаблоны?), чем из-за того что это хорошая и полезная фича. D>Мысли о том, чтобы добавить Generics в Java, появилась давным давно. Дальним прототипом Java 5 был язык Pizza. И на него оказал влияние отнюдь не C#, а скорее C++ (хотя generics сильно отличаются от C++ template).
Да я не фичу обсуждаю, а причину и время ее реализации.
Здравствуйте, Mystic, Вы писали:
M>Здравствуйте, reductor, Вы писали:
R>>Этому "плагиновому" языку скоро исполнится 50 лет. R>>Называется Лисп.
M>Представления о LISP-е у меня как раз 50-ти летней давности. Программа состоит из списков, первый элемент списка есть название функции, вторые ее аргументы, ... Как, например, встроить в LISP тот же язык SQL я не вижу :(
Программа представляет из себя уже готовй AST, потому такая странная форма.
Который можно как угодно трансформировать с помощью лисповских макросов.
так что делается просто макрос sql, который знает во что превратить то, что внутри этого выражения.
Вот замечательная книжка по лиспу для самого начального уровня (online & offline): http://www.gigamonkeys.com/book/
Там есть и про макросы и про прочее.
Лисп — это первое, с чем нужно знакомиться при тяге к метапрограммированию.
Здравствуйте, Mystic, Вы писали:
M>Тут возникает небольшой ньюанс. Используя Common SQL мы так и не уходим от синтаксиса LIST, который, как мне кажется, уступает стандартному синтаксису SQL. Например, необходимость квотирования нужных фрагментов, запись арифметических выражений и т. д. Скажем последний select как для меня гораздо более вразумительнее выглядит в виде:
M>
select customer, item, quantity from header, detail where header_id = detail_id
Здравствуйте, reductor, Вы писали:
R>Лисп — это первое, с чем нужно знакомиться при тяге к метапрограммированию.
У меня тяга не совсем к к метапрограммированию. У меня тяга к созданию компиляторов. Более радикальный подход. Скажем так, чтобы новые возможности в язык можно было вносить не средствами самого языка, а прямой правкой исходников транслятора. Ну и чтобы обеспечить наиболее удобные механизмы как для этого...
Здравствуйте, Mystic, Вы писали:
M>Здравствуйте, reductor, Вы писали:
R>>Лисп — это первое, с чем нужно знакомиться при тяге к метапрограммированию.
M>У меня тяга не совсем к к метапрограммированию. У меня тяга к созданию компиляторов. Более радикальный подход. Скажем так, чтобы новые возможности в язык можно было вносить не средствами самого языка, а прямой правкой исходников транслятора. Ну и чтобы обеспечить наиболее удобные механизмы как для этого...
Компилятору метаязыка :)
Я озвучу еще раз: лисповские макросы — это средство расширения компилятора.
С помощью его макросов можно заставить компилятор лиспа компилировать код на С++ или Обероне в Lisp VM
Ну правда в случае с С++ уже конечно смысл это делать малозаметен и сложность очень большая, а вот просто макросы для представления обероновского синтаксиса — думаю, пара часов и готово.
SQL, если его сам по себе не разбирать — это вообще не обсуждается, 3 строчки.
Здравствуйте, reductor, Вы писали:
R>Здравствуйте, Mystic, Вы писали:
M>>Здравствуйте, reductor, Вы писали:
R>>>Лисп — это первое, с чем нужно знакомиться при тяге к метапрограммированию.
M>>У меня тяга не совсем к к метапрограммированию. У меня тяга к созданию компиляторов. Более радикальный подход. Скажем так, чтобы новые возможности в язык можно было вносить не средствами самого языка, а прямой правкой исходников транслятора. Ну и чтобы обеспечить наиболее удобные механизмы как для этого...
R>Компилятору метаязыка
R>Я озвучу еще раз: лисповские макросы — это средство расширения компилятора.
R>С помощью его макросов можно заставить компилятор лиспа компилировать код на С++ или Обероне в Lisp VM
И что, неужели все это можно сделать без Lots of Irritating Superfluous Parentheses?
Здравствуйте, reductor, Вы писали:
R>Претензии к скобочкам есть только у тех, кто не пробовал нормально на лиспе программировать. R>если они такие irritating, то откуда берется вся эта любовь к лиспу у тех, кто попрограммировал на нем хотя бы немного.
Здравствуйте, beroal, Вы писали:
M>>Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования? Т. е. написал плагин --- получил некое расширение языка... Что по вашему мнению, является "лишним" в любимых Вами языках программирования, что бы можно было заменить такими плагинами? Какими свойствами должен обладать "минимальный" язык? Насколько вы допускаете для себя идею начинать каждый конкретный с адаптации конкретного языка программирования под нужды проекта? Пугает ли вас то, что в крупном проекте может использоваться несколько адаптаций (каждся для своей части)? B>Я слышал про похожий язык программирования — TCL (ещё известно сочетание TCL/TK — вместе с GUI библиотекой). В TCL даже для математических формул отдельный синтаксис, не встроенный в язык. Нет встроенных массивов. Но больше ничего сказать не могу, близко не знаком. На мой взгляд, ничего интересного у них не получилось.
Не согласен, что TCL — это "оно".
У TCL просто "минималистичный" синтаксис, а так — довольно обычный язык, со своей культурой, типичными паттернами и т.п.. Для "plug-in'ности" в нем нет и, видимо, не планировалось нормальной поддержки — хотя DSL он делать позволяет (я познакомился с TCL при изучении графического движка The Nebula Device, в котором TCL использовался для скриптов и на его основе был сделан язык описания проектов).
Здравствуйте, Mystic, Вы писали:
M>Тут возникает небольшой ньюанс. Используя Common SQL мы так и не уходим от синтаксиса LIST, который, как мне кажется, уступает стандартному синтаксису SQL. Например, необходимость квотирования нужных фрагментов, запись арифметических выражений и т. д. Скажем последний select как для меня гораздо более вразумительнее выглядит в виде:
M>
select customer, item, quantity from header, detail where header_id = detail_id
Common Lisp имеет также макросы чтения, что в принципе позволяет записать запрос так:
(loop for (c i q) in #[SQL] select customer, item, quantity from header, detail where header_id = detail_id;
do ...)
НО:
— синтаксис очень не похож на Лисповский, значит, будут проблемы с подсветкой, редактированием, сообщением об ошибках и т.д.;
— а также со вставкой Лисп-выражений в запрос (например, имени переменной name-id);
— видимый "исходный текст" радикально отличается от внутреннего представления, значит подняться еще на один мета-уровень будет сложно.
Здравствуйте, Cyberax, Вы писали:
>> M>>Вот читаешь ветки: чего не хватает, чего не хватает... А почему >> никто не спросит: что лишнего? >> _W>RAII в С++ совершенно лишний. Потому что каждая компания пишет свой >> Reflection и RAII.
Убейте меня! Я опечатался!
Вот что я хотел напечатать: RTTIв С++ совершенно лишний. Потому что каждая компания пишет свой Reflection и RTTI под свои цели.
Правильно работающая программа — просто частный случай Undefined Behavior
Здравствуйте, Mystic, Вы писали:
M>У меня тяга не совсем к к метапрограммированию. У меня тяга к созданию компиляторов. Более радикальный подход. Скажем так, чтобы новые возможности в язык можно было вносить не средствами самого языка, а прямой правкой исходников транслятора. Ну и чтобы обеспечить наиболее удобные механизмы как для этого...
править сам компилятор слишком трудно, да и опасно
по хорошему, компилятор должен обеспечивать только каркас, а описание собственно языков — с помощью специально под это заточенного DSL