мы с IT пришли к выводу, что проще всего (как технически, так и политически) ввести новый тип строки.
Сначала примеры:
def str = <#
Эта строка не только позволяет
переносить свое содержимое на новую строку и таким образом
занимать несколько строк, но так же, в ней игнорируются ведущие
сиволы строки совпадающие с последней строкой.
#>; // т.е. из всех строк будет вычтена последоватльность сиволов идущая до #> на этой строке
def str = <#
.....В качестве начальных сиволов могут использоваться любые символы.
.....Например, в данном случае используются точки.
.....#>;
def str = <#
.+...Если символы не совпали с символом последней строки,
.....то выдается ошибка времени компиляции.
.....#>;
def str = <#
Пустая первая строка (т.е. строка идущая за <#) или строка
состоящая только из пробельных сиволов игнорируется.
Причем игнорируется вместе с концом строки.
#>;
// Таким образом предыдащая строка преобразуется в:
def str = @"Пустая первая строка (т.е. строка идущая за <#) или строка
состоящая только из пробельных сиволов игнорируется.
Причем игнорируется вместе с концом строки.";
def str = <# Если
В первой строке есть текст, то он берется как есть (т.е. ничего
не отбрасывается и конец строки не игнорируется).
#>;
// Последнее можно использование для организации тегов в DSL-ях:
def str = <# sql:
SELECT Проводки.DATEDOC AS [Дата оборотов],
(SELECT sum(sub.AMOUNT) FROM Проводки as sub
WHERE sub.TYPE_ID=0 AND sub.DEBIT=True
and sub.DATEDOC = Проводки.DATEDOC)
AS [Сумма по дебету],
(SELECT sum(sub.AMOUNT) FROM Проводки as sub
WHERE sub.TYPE_ID=0 AND sub.DEBIT=True
and sub.DATEDOC <= Проводки.DATEDOC)
AS [Остаток на конец по дебету]
FROM Проводки
WHERE (((Проводки.TYPE_ID)=0))
GROUP BY Проводки.DATEDOC
ORDER BY Проводки.DATEDOC;
#>;
def str = <#
Если такой вид строк содержит пустую строку
в которой вообще нет ведущих пробельных символов.
Или символов меньше чем в последней строке, то строка считается
пустой.
#>;
Собственно интересует обсуждение этого предложения. Приветствуется критика, предложения и вопросы.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Как насчет добавления нового вида строки <# ... #> ?
мы с IT пришли к выводу, что проще всего (как технически, так и политически) ввести новый тип строки.
+1, только не ясно, а почему все же именно строка? Все равно, как строку использовать эту конструкцию вряд ли кто будет вне DSL-ей. А вот для DSL-ей самое то, т.е. новый синтаксис вводить в любом случае надо, этот вполне удачный.
VD>Сначала примеры: VD>
VD>// Последнее можно использование для организации тегов в DSL-ях:
VD>def str = <# sql:
VD> SELECT Проводки.DATEDOC AS [Дата оборотов],
VD> (SELECT sum(sub.AMOUNT) FROM Проводки as sub
VD> WHERE sub.TYPE_ID=0 AND sub.DEBIT=True
VD> and sub.DATEDOC = Проводки.DATEDOC)
VD> AS [Сумма по дебету],
VD> (SELECT sum(sub.AMOUNT) FROM Проводки as sub
VD> WHERE sub.TYPE_ID=0 AND sub.DEBIT=True
VD> and sub.DATEDOC <= Проводки.DATEDOC)
VD> AS [Остаток на конец по дебету]
VD> FROM Проводки
VD> WHERE (((Проводки.TYPE_ID)=0))
VD> GROUP BY Проводки.DATEDOC
VD> ORDER BY Проводки.DATEDOC;
VD> #>;
VD>
Выделенное не очень нравится. У меня текст может вполне начинаться с "someWord:", думаю есть смысл выделять как-то поиному, например так:
<#[sql]#
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re: Как насчет добавления нового вида строки <# ... #> ?
Здравствуйте, VladD2, Вы писали:
VD>Собственно интересует обсуждение этого предложения. Приветствуется критика, предложения и вопросы.
Слишком сложно.
ИМХО должно быть только
def str = <#
Эта строка не только позволяет
переносить свое содержимое на новую строку и таким образом
занимать несколько строк, но так же, в ней игнорируются ведущие
сиволы строки совпадающие с последней строкой.
#>; // т.е. из всех строк будет вычтена последоватльность сиволов идущая до #> на этой строке
Единственное что можно добавить в компилятор это поддержку boundary
на случай если комуто таки захочется использовать сочетание #> внутри DSL.
Вся остальная логика должна быть вне компилятора. Ибо хардкод который другим может и не понадобиться, а то и мешать будет.
Ибо DSL'и всравно обрабатывыются макросами. Пусть они и реализуют все эти пляски с начальными символами и тп.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Как насчет добавления нового вида строки <# ... #> ?
Здравствуйте, VladD2, Вы писали:
VD>мы с IT пришли к выводу, что проще всего (как технически, так и политически) ввести новый тип строки.
VD>// Последнее можно использование для организации тегов в DSL-ях: VD>def str = <# sql:
Тут имхо лучше привязать идентификатор языка к начальному тегу
VD>Собственно интересует обсуждение этого предложения. Приветствуется критика, предложения и вопросы.
Продолжу бухтёж.
Как будет обеспечиваться подсветка ?
Как будут отлавливаться ошибки, допущенные в реализации ДСЛя ?
В общем вопросы и опасения те же О потенциальных проблемах лексерных макросов
Здравствуйте, _pk_sly, Вы писали:
__>а чем не нравится вариант <![[ ... ]]!> и <![boundary[ ... ]boundary]!> ? __>вроде как тоже самое, но "стандартнее"
Думаю слишком громоздко, а чем тебя вариант <# #> не устраивает?
((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
Re[2]: Как насчет добавления нового вида строки <# ... #> ?
Здравствуйте, _pk_sly, Вы писали:
__>и как в эту строку (где не предусмотрены boundary markerы) вставить последовательность завершения строки? (в данном случае #> )
$<#
... $("<#")
#>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как насчет добавления нового вида строки <# ... #> ?
Здравствуйте, WolfHound, Вы писали:
WH>Слишком сложно. WH>ИМХО должно быть только WH>
WH>def str = <#
WH> Эта строка не только позволяет
WH> переносить свое содержимое на новую строку и таким образом
WH> занимать несколько строк, но так же, в ней игнорируются ведущие
WH> сиволы строки совпадающие с последней строкой.
WH> #>; // т.е. из всех строк будет вычтена последоватльность сиволов идущая до #> на этой строке
WH>
Тогда уж и отброс ведущих символов тоже надо на макрос возлагать. А то не ясно как быть с локешонами.
В принципе сделать фукнцию которая все это сделает будет не сложно. Так что можно так и поступить.
WH>Единственное что можно добавить в компилятор это поддержку boundary
на случай если комуто таки захочется использовать сочетание #> внутри DSL.
Ну, это уже для нас лишнее. Пусть те кому надо будет это сами и добавляют. Или упрашивают разработчиков Компилятора.
WH>Вся остальная логика должна быть вне компилятора. Ибо хардкод который другим может и не понадобиться, а то и мешать будет. WH>Ибо DSL'и всравно обрабатывыются макросами. Пусть они и реализуют все эти пляски с начальными символами и тп.
Согласен. Наверно так и поступим, то есть введем просто новый вид строки.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как насчет добавления нового вида строки <# ... #> ?
Здравствуйте, ie, Вы писали:
ie>+1, только не ясно, а почему все же именно строка? Все равно, как строку использовать эту конструкцию вряд ли кто будет вне DSL-ей. А вот для DSL-ей самое то, т.е. новый синтаксис вводить в любом случае надо, этот вполне удачный.
Потому что самое простое и проходное решение. Убедить в необходимости изменения компилятора компиляторщиков будет не просто. Плюс потом это все еще реализовывать надо. А строку я добавлю за пять минут. Еще часа 4 уйдет на фукнцию обоработки. В общем пара дней и стринг-темплэйт у нас в кормане. Только я вот сейчас с дизайнером форм копаться начал... Так что если кто возмет на себя эту задачу, я только рад буду.
ie>Выделенное не очень нравится. У меня текст может вполне начинаться с "someWord:", думаю есть смысл выделять как-то поиному, например так: ie>
. Наверно все ограничения уже на уровне макроса надо накладывать. А в язык просто добавить новый тип строк. Только, наверно, нужно еще рекурсивность обеспечить, чтобы вот так вот можно было делать:
<# .... <# ... #> ..... #>
Кстати, такая строка для поддержки ХМЛ вросто супер будет:
def var = xml <# <h1> и никаких проблем с непарными скобками ;) </h1> #>;
Прикинь... DSL — проверяемый по схеме во время компиляции ХМЛ с поддержкой сплайсинга ($-натации). Круть, блин!
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как насчет добавления нового вида строки <# ... #> ?
Здравствуйте, Mirrorer, Вы писали:
M>Тут имхо лучше привязать идентификатор языка к начальному тегу M>
M>def str = <#sql
M>
M>Чтобы не было возможных конфликтов с одинаковыми строками внутри текста.
Если нужен контекст, то лучше задавать его так:
def str = sql <# ... #>;
и использовать штатный механизм лексемных макросов.
M>Как будет обеспечиваться подсветка ?
Это же будет штатная строка. Так что будет как обычно. Плюс можно ввести некое соглашение, чтобы вызвать некие пользовательские подсвечиватели. Было бы прикольно, чтобы, например, в стрин-темплейте работающем с SQL сами шаблоны подсвечивались как SQL и чтобы еще $-сплайсы выделялись. Но это уже мечты... Пока будет просто строка.
M>Как будут отлавливаться ошибки, допущенные в реализации ДСЛя ?
Это проблемы макросов реализующих ДСЛ. Так же как сейчас выдается диагностика к $-строкам, так и они будут.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как насчет добавления нового вида строки <# ... #> ?
Здравствуйте, _pk_sly, Вы писали:
__>а чем не нравится вариант <![[ ... ]]!> и <![boundary[ ... ]boundary]!> ? __>вроде как тоже самое, но "стандартнее"
Выглядит жудко.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Как насчет добавления нового вида строки <# ... #> ?
VD>Только, наверно, нужно еще рекурсивность обеспечить, чтобы вот так вот можно было делать: VD>
VD><# .... <# ... #> ..... #>
VD>
с рекурсивностью универсально проблему всё равно не решить, даже boundary не поможет в общем случае.
a = "#>"
b = <# ... <# ... $(a) ... #> ... #>
а если уж вводить функции-аналоги escape/unescape, (или addslashes/stripslashes), то они могут завершающий тэг в $("#>") превращать — им всё равно, как именно это делать.
Re[3]: Как насчет добавления нового вида строки <# ... #> ?
Здравствуйте, VladD2, Вы писали:
VD> Было бы прикольно, чтобы, например, в стрин-темплейте работающем с SQL сами шаблоны подсвечивались как SQL и чтобы еще $-сплайсы выделялись.
Об этом я как раз и думал.
VD>Но это уже мечты... Пока будет просто строка.
Ну строка, значит строка. Главное, чтобы работало
"Если Вы отличаетесь от меня, то это ничуть мне не вредит — Вы делаете меня богаче". Экзюпери
Re[4]: Как насчет добавления нового вида строки <# ... #> ?
Здравствуйте, _pk_sly, Вы писали:
__>а если уж вводить функции-аналоги escape/unescape, (или addslashes/stripslashes), то они могут завершающий тэг в $("#>") превращать — им всё равно, как именно это делать.
Это не просто эскейп-последовательности. Это полноценная $-нотация. В ней может быть переменна, выражение и т.п. строка просто частный случай.
Естественно, что там может быть и #>.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Как насчет добавления нового вида строки <# ... #> ?
VD>Это не просто эскейп-последовательности. Это полноценная $-нотация. В ней может быть переменна, выражение и т.п. строка просто частный случай.
VD>Естественно, что там может быть и #>.
это я догадался. однако, как "просто эскейп-последовательности" оно тоже работает.
а в приведённом мной примере будет сгенерён неверный код.
очевидно, люди захотят от этого защититься
для этого каждый себе напишет по функции для перевода туда-обратно.
ну, это ладно, функция несложная, пусть пишут
но если считать вложенность компилятором, как выйти из такой ситуации:
a = <#
if (...) {
print "<# ... ";
} else if (...) {
print "<# ... ";
}
print "#>";
#>
если компилятор у нас вложенности не отслеживает, то пишем так:
a = <#
if (...) {
print "<# ... ";
} else if (...) {
print "<# ... ";
}
print "$("#>")";
#>
или так
a = <#
if (...) {
print <#<# ... $("#>");
} else if (...) {
print <#<# ... $("#>");
}
print $("$(\"#>\")"); <<<--- кривизна
#>
если же отслеживает, то "правильного" способа описания этой ситуации я вообще не вижу.
двойная вложенность, но середина никуда не вложена.
была борьба за кавычки, заменили кавычки другими закорючками, теперь не ясно что делать с ними 8)