Re[8]: Можно ли это сделать с "="
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.05.07 17:51
Оценка:
Здравствуйте, ie, Вы писали:

ie>Я думаю использовать "=" так просто не получится. Компилятор будет расценивать это использование как assignment.


Значич так. Можно делать почти все что угодно, но по хитрому.

Как? Смотрите как реализован foreach:
  macro @foreach (inexpr, body)
  syntax ("foreach", "(", inexpr, ")", body)
  {
    ...

Как видите никаких in в помине нет. Вместо этого мы получаем некое (абстрактное) выражение inexpr.

Далее inexpr обрабатывается паттерн-матчингом и из него вычленяются нужные конструкции. Естественно, что если они не вычленелись, то мы имеем дело с ошибочным синтаксисом. Собственно пример из того же foreach-а:
def (iter, collection) =
    match (inexpr) {
        | <[ $i in $c ]> => (i, c)
        | e =>
            Message.FatalError ($ "the syntax is 'foreach (x in collection)', "
                                                        "got $e");
    }

Никаких проблем в том, чтобы заменить "in" на "=" нет.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Два дурацких вопроса по примеру реализации for
От: Kisloid Мухосранск  
Дата: 27.05.07 07:25
Оценка:
Здравствуйте, VladD2, Вы писали:

K>>Никакие не стереотипы, просто изначально хотел вывести строку с комментариями, что то вроде этого:

K>>
K>>WriteLine($"Для i = $i из диапазона... бла бла");
K>>


VD>Ну, нихай. В любом случае ничего нужного в этоем нет. WriteLine перегружен для всех простых типов данных и на крайняк принимает object.


Да согласный я, облажался, писал это на подсознательном уровне, не задумываясь. Да и по мне удобнее писать так:
WriteLine($"Arg1 = $arg1, Arg2 = $arg2, Arg3 = $arg3 ...");

чем так:
WriteLine("Arg1 = " + arg1 + ", Arg2 = " + arg2 + ", Arg3 = " + arg3 + " ...");

или еще хуже:
WriteLine("Arg1 = {0}, Arg2 = {1}, Arg3 = {2} ...", arg1, arg2, arg3);

((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
Re[13]: Два дурацких вопроса по примеру реализации for
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.05.07 14:41
Оценка:
Здравствуйте, Kisloid, Вы писали:

K> Да и по мне удобнее писать так:

K>
K>WriteLine($"Arg1 = $arg1, Arg2 = $arg2, Arg3 = $arg3 ...");
K>

K>чем так:
K>
K>WriteLine("Arg1 = " + arg1 + ", Arg2 = " + arg2 + ", Arg3 = " + arg3 + " ...");
K>


+1

K>или еще хуже:

K>
K>WriteLine("Arg1 = {0}, Arg2 = {1}, Arg3 = {2} ...", arg1, arg2, arg3);
K>


А вот это уже завист.
У такого способа есть свои приемущества которых нельзя достичь средствами $-строки.
1. Можно применять расширенное форматирвоание.
2. Можно заменять строку формата динамически.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Можно ли это сделать с "="
От: FDSC Россия consp11.github.io блог
Дата: 27.05.07 17:27
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, ie, Вы писали:


ie>>Я думаю использовать "=" так просто не получится. Компилятор будет расценивать это использование как assignment.


VD>Значич так. Можно делать почти все что угодно, но по хитрому.


VD>Как? Смотрите как реализован foreach:

VD>
VD>  macro @foreach (inexpr, body)
VD>  syntax ("foreach", "(", inexpr, ")", body)
VD>  {
VD>    ...
VD>

VD>Как видите никаких in в помине нет. Вместо этого мы получаем некое (абстрактное) выражение inexpr.

VD>Далее inexpr обрабатывается паттерн-матчингом и из него вычленяются нужные конструкции. Естественно, что если они не вычленелись, то мы имеем дело с ошибочным синтаксисом. Собственно пример из того же foreach-а:

VD>
VD>def (iter, collection) =
VD>    match (inexpr) {
VD>        | <[ $i in $c ]> => (i, c)
VD>        | e =>
VD>            Message.FatalError ($ "the syntax is 'foreach (x in collection)', "
VD>                                                        "got $e");
VD>    }
VD>

VD>Никаких проблем в том, чтобы заменить "in" на "=" нет.

Угу, тут слишком хитро... дело в том, что foreach( вполне может восприниматься компилятором как начало явного вызова макроса,
а вот forAll i = [0; 1] так восприниматься не будет, потому что в синтаксисе нет открывающей скобки



  macro @forAll (varI, begin, end, body)
  syntax ("forAll", varI, "[", begin, "..", end, "]", body) 
  {
    
     match(varI)
     {
         | <[ $var = $empty ]> => <[
          for (mutable $var = $begin; $var <= $end; $var++)
      {
        $body
      }
    ]>
         | _ => <[()]>
     }
  }
  
  macro @forAllBad (varI, body)
  syntax ("forAllBad", "(", varI, ")", body) 
  {
    
     match(varI)
     {
         | <[ $var = [$begin , $end] ]> => <[
          for (mutable $var = $begin; $var <= $end; $var++)
      {
        $body
      }
    ]>
         | _ => <[()]>
     }
  }




        // Здесь ошибка разбора
    forAll i = [5 .. 7]
    {
        WriteLine($"$i");
    }
 
     // Здесь её нет
    forAllBad(i = [3, 6])
    {
        WriteLine($"$i");
    }



Error    1    parse error near '{...}' group: expecting '[' and some tokens inside. Parse error near '{...}' group: unexpected end of token sequence. Parse error near separator or closing bracket: expecting expression    F:\Prg\tmp\070524\NilListCheck\Main.n    33    2    NilListCheck
Error    2    unable to parse syntax rule, stopped at: ]. Parse error    F:\Prg\tmp\070524\NilListCheck\Main.n    32    2    NilListCheck
Error    5    parse error near `{...}' group: expecting `[' and some tokens inside    F:\Prg\tmp\070524\NilListCheck\Main.n    33    3    NilListCheck
Error    6    parse error near `{...}' group: unexpected end of token sequence    F:\Prg\tmp\070524\NilListCheck\Main.n    33    3    NilListCheck
Error    7    parse error near separator or closing bracket: expecting expression    F:\Prg\tmp\070524\NilListCheck\Main.n    33    3    NilListCheck
Error    8    parse error near `{...}' group: unexpected end of token sequence    F:\Prg\tmp\070524\NilListCheck\Main.n    33    3    NilListCheck
Error    9    parse error near separator or closing bracket: expecting operator `..'    F:\Prg\tmp\070524\NilListCheck\Main.n    33    3    NilListCheck
Error    10    parse error near `{...}' group: unexpected end of token sequence    F:\Prg\tmp\070524\NilListCheck\Main.n    33    3    NilListCheck
Error    11    parse error near separator or closing bracket: expecting expression    F:\Prg\tmp\070524\NilListCheck\Main.n    33    3    NilListCheck
Error    12    unable to parse syntax rule, stopped at: ]    F:\Prg\tmp\070524\NilListCheck\Main.n    32    3    NilListCheck





P.S. Я правильно понял что чтобы получить доступ к глобальной переменной из макроса её нужно просто указать внутри <[]> как обычный код,
например вызов глобальных функций Exec и т.п. и создание локальной переменной mutexs, видной только в области определения именно этого макроса, будет выглядеть как-то так

macro тры-ты-ты
{
       def mutexs = Nemerle.Macros.Symbol (Util.tmpname ("forAllPT_"));
<[
       if ($end - $begin >= 0)
       {
       def $(mutexs:name): array[object] = CreateWait($end - $begin + 1);

       for (mutable $var = $begin; $var <= $end; $var++)
         {
           Exec($(mutexs:name)[$var]);
         }
         Wait($(mutexs:name));
       }
    ]>
}

?
Re[10]: Можно ли это сделать с "="
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.05.07 19:56
Оценка:
Здравствуйте, FDSC, Вы писали:

Зачем так оверквотить?

FDS>Угу, тут слишком хитро... дело в том, что foreach( вполне может восприниматься компилятором как начало явного вызова макроса,

FDS>а вот forAll i = [0; 1] так восприниматься не будет, потому что в синтаксисе нет открывающей скобки

Ну, и что мешает добавит их? С ними стиль будет ближе к стандартным макросам.

Немерел разбирает код специальным образом разбивая лексемы на группы. Группы делятся в основном по скобкам. По этому без них будет жить тяжело.

FDS>P.S. Я правильно понял что чтобы получить доступ к глобальной переменной из макроса её нужно просто указать внутри <[]> как обычный код,


Не савсем. По умолчанию будет работать гигиена и все имена объявленные внутри макроса будут переименовываться (к ним будет добаляться номер "цвета"). Здесь
Автор: VladD2
Дата: 26.05.07
сказано как это обойти.

FDS>например вызов глобальных функций Exec


Вызовы будут рабтать и так. Тут речь идет только о вводимых в макросах переменных.

FDS> и т.п. и создание локальной переменной mutexs, видной только в области определения именно этого макроса, будет выглядеть как-то так


FDS>
FDS>macro тры-ты-ты
FDS>{
FDS>       def mutexs = Nemerle.Macros.Symbol (Util.tmpname ("forAllPT_"));
FDS><[
FDS>       if ($end - $begin >= 0)
FDS>       {
FDS>       def $(mutexs:name): array[object] = CreateWait($end - $begin + 1);

FDS>       for (mutable $var = $begin; $var <= $end; $var++)
FDS>         {
FDS>           Exec($(mutexs:name)[$var]);
FDS>         }
FDS>         Wait($(mutexs:name));
FDS>       }
FDS>    ]>
FDS>}
FDS>

FDS>?

В данном случае mutexs как раз будет превращаться в автоматически переименовываемую переменную (которая не пересечется с такой же из другого контекста). Так что можно было бы просто этого не делать, так как по умолчанию имена переменных и так уникальны. Если нужен доступ к переменным из области объявления, то их нужно передавать как переменные (т.е. mutexs должен был быть вычленен из переданного кода), объявляться с использованием $(... : usesite), или нужно модифицировать контес с помощью фунции Manager.MacroColors.PushUseSiteColor().
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Можно ли это сделать с "="
От: FDSC Россия consp11.github.io блог
Дата: 27.05.07 20:33
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, FDSC, Вы писали:


VD>Зачем так оверквотить?


Что, сильно? Я просто всегда забываю, что было до этого и когда убирают цитаты, меня обычно разражает сильно

VD>Ну, и что мешает добавит их? С ними стиль будет ближе к стандартным макросам.


А если мне хочется, что бы это была именно конструкция без скобок? Ещё одни скобки, лишние символы... просто удобнее было бы

В принципе, мне, например, вообще не хватает Matlab-овского (или хотя бы PL-евского) синтаксиса, когда можно написать k = A(1:6, 2:5) и в итоге из A скопируются данные с 1-ой по 6-ую строки со 2-ого по 5-ый столбец... всё-таки это было бы удобнее, в конце концов Nemerle не только функциональный язык
А как такое сделать, я вообще не представляю, опять, наверняка будут какие-нибудь заморочки и ничего нормально не получится


VD>Не савсем. По умолчанию будет работать гигиена и все имена объявленные внутри макроса будут переименовываться (к ним будет добаляться номер "цвета"). Здесь
Автор: VladD2
Дата: 26.05.07
сказано как это обойти.


А, спасибо, теперь дошло. Как раз использовать их дальше не нужно
Re[12]: Можно ли это сделать с "="
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.07 13:10
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>В принципе, мне, например, вообще не хватает Matlab-овского (или хотя бы PL-евского) синтаксиса, когда можно написать k = A(1:6, 2:5) и в итоге из A скопируются данные с 1-ой по 6-ую строки со 2-ого по 5-ый столбец... всё-таки это было бы удобнее, в конце концов Nemerle не только функциональный язык

FDS>А как такое сделать, я вообще не представляю,

По идее, создаешь макрос A с двумя параметарами и их уже паттерн-матчингом обрабатываешь. Тут делать нечего. Я бы скорее подумал насколько это нужно. Ведь не всем этот синтаксис будет очевидным.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Можно ли это сделать с "="
От: FDSC Россия consp11.github.io блог
Дата: 28.05.07 15:35
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>По идее, создаешь макрос A с двумя параметарами и их уже паттерн-матчингом обрабатываешь. Тут делать нечего. Я бы скорее подумал насколько это нужно. Ведь не всем этот синтаксис будет очевидным.


А — это не макрос, а массив... имени макроса тут нет

Если непонятно, могу пояснить подробнее.

Например, перемножение матриц A и B в MatLab может выглядеть так


i = 1:L;
j = 1:K;
C(i, j) = A(i, :) * B(:, j);



На Nemerle (без макросов) это выглядит так:

for (mutable i = 0; i < L; i++)
  for (mutable j = 0; j < K; j++)
  {
    C[i, j] = 0.0;
    for (mutable k = 0; k < M; k++)
      C[i, j] += A[i, k] * B[k, j];
  }


Ну, перемножение можно сделать и функцией, но бывают вещи по сложнее, которые с "векторным" синтаксисом выглядят гораздо лучше. Вот у меня впечатление, что сделать такую вещь с помощью макросов в Немерле невозможно...
Re[14]: Можно ли это сделать с "="
От: ie Россия http://ziez.blogspot.com/
Дата: 29.05.07 04:56
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Например, перемножение матриц A и B в MatLab может выглядеть так


FDS>
FDS>i = 1:L;
FDS>j = 1:K;
FDS>C(i, j) = A(i, :) * B(:, j);
FDS>


А на J так:
c =. a * b


Только вот делать из Nemerle J или Matlab, наверное, не стоит.

FDS>На Nemerle (без макросов) это выглядит так:

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

Да, на Немерле далеко не все возможно, но так ли это плохо? Нужны мега-вычисления, возьми J или Matlab, нужны логические вычисления — пролог в руки, благо и то и то имеет возможность интегрироваться с .NET
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[15]: Можно ли это сделать с "="
От: FDSC Россия consp11.github.io блог
Дата: 29.05.07 10:44
Оценка:
Здравствуйте, ie, Вы писали:

ie>Здравствуйте, FDSC, Вы писали:


FDS>>Например, перемножение матриц A и B в MatLab может выглядеть так


FDS>>
FDS>>i = 1:L;
FDS>>j = 1:K;
FDS>>C(i, j) = A(i, :) * B(:, j);
FDS>>


ie>А на J так:

ie>
ie>c =. a * b
ie>


В MatLab то же так можно, я показал суммирование в общем виде, когда можно брать только те столбцы, которые хочешь

ie>Только вот делать из Nemerle J или Matlab, наверное, не стоит.




ie>Да, на Немерле далеко не все возможно, но так ли это плохо? Нужны мега-вычисления, возьми J или Matlab, нужны логические вычисления — пролог в руки, благо и то и то имеет возможность интегрироваться с .NET


Хм. Это, конечно, можно, но мне Немерле понравился. Да и потом, J — совершенно незнакомый язык и, вполне возможно, там нет вложенных функций, а MatLab вообще страдает производительностью
Re[14]: Можно ли это сделать с "="
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.06.07 00:39
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>На Nemerle (без макросов) это выглядит так:


FDS>
FDS>for (mutable i = 0; i < L; i++)
FDS>  for (mutable j = 0; j < K; j++)
FDS>  {
FDS>    C[i, j] = 0.0;
FDS>    for (mutable k = 0; k < M; k++)
FDS>      C[i, j] += A[i, k] * B[k, j];
FDS>  }
FDS>


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


Тут скорее не макросы нужны, а инкапсуляция матриц в абстрактном типе данных поддерживающем необъодимые операторы. Потипу DateTime.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Два дурацких вопроса по примеру реализации for
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.06.07 21:42
Оценка:
Здравствуйте, FDSC, Вы писали:

Может заинтересует...

Re[3]: Как добраться до реального типа PExpr?
Автор: VladD2
Дата: 20.06.07
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.