Доделал поддержку рекурсивной строки
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.06.07 23:23
Оценка: 79 (6)
Примеры применения можно увидить здесь
http://nemerle.org/svn/nemerle/trunk/ncc/testsuite/positive/recursive-string.n

Общая суть заключается в том, что данный вид строк повзоляет использовать символ " без дополнительного траха и позволяет определять рекурсивно вложенные строки (пример этого в том же файле выше).
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Доделал поддержку рекурсивной строки
От: IT Россия linq2db.com
Дата: 14.06.07 00:30
Оценка:
Здравствуйте, VladD2, Вы писали:

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


А как с циклами бороться? Или со списками?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Доделал поддержку рекурсивной строки
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.06.07 23:16
Оценка:
Здравствуйте, IT, Вы писали:

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


IT>А как с циклами бороться? Или со списками?


Ничего не понял. Поясните суть вопроса, сэр!
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Доделал поддержку рекурсивной строки
От: IT Россия linq2db.com
Дата: 14.06.07 23:35
Оценка:
Здравствуйте, VladD2, Вы писали:

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


IT>>А как с циклами бороться? Или со списками?


VD>Ничего не понял. Поясните суть вопроса, сэр!


Как-нибудь можно вывести массив или список через рекурсивное задание подстроки?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Доделал поддержку рекурсивной строки
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.06.07 00:19
Оценка:
Здравствуйте, IT, Вы писали:

IT>Как-нибудь можно вывести массив или список через рекурсивное задание подстроки?


Это просто строки. Они от обычных ничем не отличаются. А вот здесь svn://svn.rsdn.ru/Rsdn2/trunk/Playground/StringTemplate лежит СтрингТемлпэйт который как раз такие вещи позволяет делать (на этой строке основанный). Собственно вот тест от туда:
using System;
using Nemerle.Collections;
using System.Console;
using Nemerle.Utility;
using StringTemplate;
using SCG = System.Collections.Generic;

[Record]
public class Index
{
  public Name      : string;
  public Entries   : list[IndexEntry];
}

[Record]
public class IndexEntry
{
  public Name        : string;
  public IsDescend   : bool;
}

[StringTemplateGroup]
public class MyTemplateGroup
{
  Values : list[string] = ["<Test1>", "<Test2>"];
  Value : string = "<Test3>#\n<Test4>#";
  
  Batch(indexs : list[Index]) : string {<#
  BEGIN TRAN
    ..$(indexs; "\ngo\n\n"; CreateIndex)
    go
  COMMIT TRAN
  #>}
  
  CreateIndex(index : Index) : string {<#
..CREATE INDEX $(index.Name)
..(
..  ..$(index.Entries; ",\n"; IndxEntry)
..  {
..    $(TestNewLine())
..    ..$(Values; ";\n");
..    $Value
..  }
..)
..#>}

  static TestNewLine() : string
  {
    def x = "QQQ\nGGG";
    x
  }

  IndxEntry(entry : IndexEntry) : string {<#
  $(entry.Name)$(Descend(entry))
  #>}
  
  Descend(entry : IndexEntry) : string { if (entry.IsDescend) " DESC" else "" }
  
  public Test1() : void { }
  public Test2() : int { 0 }
} 
 
module Program
{
  Main() : void
  {
    def indexs = [
      Index("MyIndex1", [IndexEntry("Col1", false), IndexEntry("Col2", true)]),
      Index("MyIndex2", [IndexEntry("Column2", false), IndexEntry("Col3", false)]),
      ];
    System.Console.BackgroundColor = ConsoleColor.DarkCyan;
    Write(MyTemplateGroup.Batch(indexs));
    System.Console.ResetColor();
    WriteLine();
    Write("...");
    _ = ReadLine();
  }
}

Выводит:
BEGIN TRAN
  CREATE INDEX MyIndex1
  (
    Col1,
    Col2 DESC
    {
      QQQ
      GGG
      <Test1>;
      <Test2>;
      <Test3>#
      <Test4>#
    }
  )
  go

  CREATE INDEX MyIndex2
  (
    Column2,
    Col3
    {
      QQQ
      GGG
      <Test1>;
      <Test2>;
      <Test3>#
      <Test4>#
    }
  )
  go
COMMIT TRAN
...
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Доделал поддержку рекурсивной строки
От: _pk_sly  
Дата: 15.06.07 10:34
Оценка:
VD>Общая суть заключается в том, что данный вид строк повзоляет использовать символ " без дополнительного траха и позволяет определять рекурсивно вложенные строки (пример этого в том же файле выше).

убрал трах с символом кавычки — получил трах с символом доллара
Re[2]: Доделал поддержку рекурсивной строки
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.06.07 16:24
Оценка:
Здравствуйте, _pk_sly, Вы писали:

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


__>убрал трах с символом кавычки — получил трах с символом доллара


Можно говорить конкретно? Какая-то ошибка? Опиши, в чем дело.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Доделал поддержку рекурсивной строки
От: _pk_sly  
Дата: 15.06.07 17:02
Оценка:
__>>убрал трах с символом кавычки — получил трах с символом доллара

VD>Можно говорить конкретно? Какая-то ошибка? Опиши, в чем дело.


не ошибка.
кавычки (или строки) теперь легко сделать любого уровня вложенности.
только если там отсутствует символ $

допустим, я хочу сгенерить через $<#...#>-строку такой код:
(это из примера)
def sss = $<#$("qwe")#>;


при этом название переменной — вычисляется
если я правильно понимаю, это делается так:

def varname = "sss";
def str = $<#def $(varname) = $("$")<#$("$")("qwe")#>;#>;


не очень-то читабельно.
что будет в следующем уровне вложенности — страшно подумать! а ведь это делается именно ради вложенных строк?

disclaimer: я не хочу сказать что фича — бесполезная или вредная, такой тип вложенных string quotation присутствует во многих языках. но с $-подстановкой тут явно недоработка.
не фатальная, конечно.
Re[4]: Доделал поддержку рекурсивной строки
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.06.07 13:49
Оценка:
Здравствуйте, _pk_sly, Вы писали:

__>>>убрал трах с символом кавычки — получил трах с символом доллара


VD>>Можно говорить конкретно? Какая-то ошибка? Опиши, в чем дело.


__>не ошибка.

__>кавычки (или строки) теперь легко сделать любого уровня вложенности.
__>только если там отсутствует символ $


$ тут не причем. Внутри строки вложенные <# и #> просто игнорируются. Если кто-то хочет их выделять как подстроки, то он должен длеть это врнуючную. Символ $ же интерпретируется в зависиомости от того является ли строка $-строкой. Если да, то $ внутри строки распознается как спецсимвол. Причем вложенные $<# ни на что не влияют.

__>допустим, я хочу сгенерить через $<#...#>-строку такой код:

__>(это из примера)
__>
__>def sss = $<#$("qwe")#>;
__>


Такая строка аналогична строке:
"$(\"qwe\")"
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.