Как насчет добавления нового вида строки <# ... #> ?
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.04.07 23:25
Оценка:
Думая над тем как же лучше реализовать Движок текстовых шаблонов
Автор: VladD2
Дата: 11.04.07
мы с 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: Как насчет добавления нового вида строки <# ... #> ?
От: ie Россия http://ziez.blogspot.com/
Дата: 16.04.07 05:33
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Думая над тем как же лучше реализовать Движок текстовых шаблонов
Автор: VladD2
Дата: 11.04.07
мы с 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: Как насчет добавления нового вида строки <# ... #> ?
От: WolfHound  
Дата: 16.04.07 06:10
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Собственно интересует обсуждение этого предложения. Приветствуется критика, предложения и вопросы.

Слишком сложно.
ИМХО должно быть только
def str = <#
    Эта строка не только позволяет
        переносить свое содержимое на новую строку и таким образом
        занимать несколько строк, но так же, в ней игнорируются ведущие
        сиволы строки совпадающие с последней строкой.
    #>; // т.е. из всех строк будет вычтена последоватльность сиволов идущая до #> на этой строке

Единственное что можно добавить в компилятор это поддержку boundary
Автор: WolfHound
Дата: 14.04.07
на случай если комуто таки захочется использовать сочетание #> внутри DSL.

Вся остальная логика должна быть вне компилятора. Ибо хардкод который другим может и не понадобиться, а то и мешать будет.
Ибо DSL'и всравно обрабатывыются макросами. Пусть они и реализуют все эти пляски с начальными символами и тп.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Как насчет добавления нового вида строки <# ... #> ?
От: Mirrorer  
Дата: 16.04.07 06:23
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>мы с IT пришли к выводу, что проще всего (как технически, так и политически) ввести новый тип строки.


VD>// Последнее можно использование для организации тегов в DSL-ях:

VD>def str = <# sql:
Тут имхо лучше привязать идентификатор языка к начальному тегу
def str = <#sql

Чтобы не было возможных конфликтов с одинаковыми строками внутри текста. Как здесь Re: Как насчет добавления нового вида строки &lt;# ... #&gt; ?
Автор: ie
Дата: 16.04.07


VD>Собственно интересует обсуждение этого предложения. Приветствуется критика, предложения и вопросы.

Продолжу бухтёж.

Как будет обеспечиваться подсветка ?
Как будут отлавливаться ошибки, допущенные в реализации ДСЛя ?
В общем вопросы и опасения те же
О потенциальных проблемах лексерных макросов
Автор: Mirrorer
Дата: 15.04.07
"Если Вы отличаетесь от меня, то это ничуть мне не вредит — Вы делаете меня богаче". Экзюпери
Re: Как насчет добавления нового вида строки <# ... #> ?
От: _pk_sly  
Дата: 16.04.07 07:39
Оценка:
а чем не нравится вариант <![[ ... ]]!> и <![boundary[ ... ]boundary]!> ?
вроде как тоже самое, но "стандартнее"
Re: Как насчет добавления нового вида строки <# ... #> ?
От: _pk_sly  
Дата: 16.04.07 07:40
Оценка:
и как в эту строку (где не предусмотрены boundary markerы) вставить последовательность завершения строки? (в данном случае #> )
Re[2]: Как насчет добавления нового вида строки <# ... #> ?
От: Kisloid Мухосранск  
Дата: 16.04.07 07:43
Оценка:
Здравствуйте, _pk_sly, Вы писали:

__>а чем не нравится вариант <![[ ... ]]!> и <![boundary[ ... ]boundary]!> ?

__>вроде как тоже самое, но "стандартнее"

Думаю слишком громоздко, а чем тебя вариант <# #> не устраивает?
((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
Re[2]: Как насчет добавления нового вида строки <# ... #> ?
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.04.07 07:58
Оценка:
Здравствуйте, _pk_sly, Вы писали:

__>и как в эту строку (где не предусмотрены boundary markerы) вставить последовательность завершения строки? (в данном случае #> )


$<#
  ... $("<#")
  #>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как насчет добавления нового вида строки <# ... #> ?
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.04.07 09:47
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Слишком сложно.

WH>ИМХО должно быть только
WH>
WH>def str = <#
WH>    Эта строка не только позволяет
WH>        переносить свое содержимое на новую строку и таким образом
WH>        занимать несколько строк, но так же, в ней игнорируются ведущие
WH>        сиволы строки совпадающие с последней строкой.
WH>    #>; // т.е. из всех строк будет вычтена последоватльность сиволов идущая до #> на этой строке
WH>


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

В принципе сделать фукнцию которая все это сделает будет не сложно. Так что можно так и поступить.

WH>Единственное что можно добавить в компилятор это поддержку boundary
Автор: WolfHound
Дата: 14.04.07
на случай если комуто таки захочется использовать сочетание #> внутри DSL.


Ну, это уже для нас лишнее. Пусть те кому надо будет это сами и добавляют. Или упрашивают разработчиков Компилятора.

WH>Вся остальная логика должна быть вне компилятора. Ибо хардкод который другим может и не понадобиться, а то и мешать будет.

WH>Ибо DSL'и всравно обрабатывыются макросами. Пусть они и реализуют все эти пляски с начальными символами и тп.

Согласен. Наверно так и поступим, то есть введем просто новый вид строки.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как насчет добавления нового вида строки <# ... #> ?
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.04.07 09:47
Оценка:
Здравствуйте, ie, Вы писали:

ie>+1, только не ясно, а почему все же именно строка? Все равно, как строку использовать эту конструкцию вряд ли кто будет вне DSL-ей. А вот для DSL-ей самое то, т.е. новый синтаксис вводить в любом случае надо, этот вполне удачный.


Потому что самое простое и проходное решение. Убедить в необходимости изменения компилятора компиляторщиков будет не просто. Плюс потом это все еще реализовывать надо. А строку я добавлю за пять минут. Еще часа 4 уйдет на фукнцию обоработки. В общем пара дней и стринг-темплэйт у нас в кормане. Только я вот сейчас с дизайнером форм копаться начал... Так что если кто возмет на себя эту задачу, я только рад буду.


ie>Выделенное не очень нравится. У меня текст может вполне начинаться с "someWord:", думаю есть смысл выделять как-то поиному, например так:

ie>
ie><#[sql]#
ie>


Ну, это споры о вкусе. Я склоняюсь к мнению Вольфхаунда
Автор: WolfHound
Дата: 16.04.07
. Наверно все ограничения уже на уровне макроса надо накладывать. А в язык просто добавить новый тип строк. Только, наверно, нужно еще рекурсивность обеспечить, чтобы вот так вот можно было делать:
<# .... <# ... #> ..... #>

Кстати, такая строка для поддержки ХМЛ вросто супер будет:
def var = xml <# <h1> и никаких проблем с непарными скобками ;) </h1> #>;

Прикинь... DSL — проверяемый по схеме во время компиляции ХМЛ с поддержкой сплайсинга ($-натации). Круть, блин!
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как насчет добавления нового вида строки <# ... #> ?
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.04.07 09:47
Оценка:
Здравствуйте, 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]: Как насчет добавления нового вида строки <# ... #> ?
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.04.07 09:47
Оценка:
Здравствуйте, _pk_sly, Вы писали:

__>а чем не нравится вариант <![[ ... ]]!> и <![boundary[ ... ]boundary]!> ?

__>вроде как тоже самое, но "стандартнее"

Выглядит жудко.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Как насчет добавления нового вида строки <# ... #> ?
От: _pk_sly  
Дата: 16.04.07 09:56
Оценка:
VD>Только, наверно, нужно еще рекурсивность обеспечить, чтобы вот так вот можно было делать:
VD>
VD><# .... <# ... #> ..... #>
VD>


с рекурсивностью универсально проблему всё равно не решить, даже boundary не поможет в общем случае.

a = "#>"
b = <# ... <# ... $(a) ... #> ... #>


а если уж вводить функции-аналоги escape/unescape, (или addslashes/stripslashes), то они могут завершающий тэг в $("#>") превращать — им всё равно, как именно это делать.
Re[3]: Как насчет добавления нового вида строки <# ... #> ?
От: Mirrorer  
Дата: 16.04.07 11:07
Оценка:
Здравствуйте, VladD2, Вы писали:

VD> Было бы прикольно, чтобы, например, в стрин-темплейте работающем с SQL сами шаблоны подсвечивались как SQL и чтобы еще $-сплайсы выделялись.

Об этом я как раз и думал.

VD>Но это уже мечты... Пока будет просто строка.

Ну строка, значит строка. Главное, чтобы работало
"Если Вы отличаетесь от меня, то это ничуть мне не вредит — Вы делаете меня богаче". Экзюпери
Re[4]: Как насчет добавления нового вида строки <# ... #> ?
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.04.07 11:49
Оценка:
Здравствуйте, _pk_sly, Вы писали:

__>а если уж вводить функции-аналоги escape/unescape, (или addslashes/stripslashes), то они могут завершающий тэг в $("#>") превращать — им всё равно, как именно это делать.


Это не просто эскейп-последовательности. Это полноценная $-нотация. В ней может быть переменна, выражение и т.п. строка просто частный случай.

Естественно, что там может быть и #>.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Как насчет добавления нового вида строки <# ... #> ?
От: _pk_sly  
Дата: 16.04.07 13:35
Оценка:
VD>Это не просто эскейп-последовательности. Это полноценная $-нотация. В ней может быть переменна, выражение и т.п. строка просто частный случай.

VD>Естественно, что там может быть и #>.


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

ну, это ладно, функция несложная, пусть пишут

но если считать вложенность компилятором, как выйти из такой ситуации:
a = <#
  if (...) {
    print "<# ... ";
  } else if (...) {
    print "<# ... ";
  }
  print "#>";
#>

если компилятор у нас вложенности не отслеживает, то пишем так:
a = <#
  if (...) {
    print "<# ... ";
  } else if (...) {
    print "<# ... ";
  }
  print "$("#>")";
#>

или так
a = <#
  if (...) {
    print <#<# ... $("#>");
  } else if (...) {
    print <#<# ... $("#>");
  }
  print $("$(\"#>\")");    <<<--- кривизна
#>

если же отслеживает, то "правильного" способа описания этой ситуации я вообще не вижу.
двойная вложенность, но середина никуда не вложена.

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

просто мнение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.