Как видите никаких 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
А вот это уже завист.
У такого способа есть свои приемущества которых нельзя достичь средствами $-строки.
1. Можно применять расширенное форматирвоание.
2. Можно заменять строку формата динамически.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ie, Вы писали:
ie>>Я думаю использовать "=" так просто не получится. Компилятор будет расценивать это использование как assignment.
VD>Значич так. Можно делать почти все что угодно, но по хитрому.
VD>Как? Смотрите как реализован foreach: 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] так восприниматься не будет, потому что в синтаксисе нет открывающей скобки
// Здесь ошибка разбора
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, видной только в области определения именно этого макроса, будет выглядеть как-то так
Зачем так оверквотить?
FDS>Угу, тут слишком хитро... дело в том, что foreach( вполне может восприниматься компилятором как начало явного вызова макроса, FDS>а вот forAll i = [0; 1] так восприниматься не будет, потому что в синтаксисе нет открывающей скобки
Ну, и что мешает добавит их? С ними стиль будет ближе к стандартным макросам.
Немерел разбирает код специальным образом разбивая лексемы на группы. Группы делятся в основном по скобкам. По этому без них будет жить тяжело.
FDS>P.S. Я правильно понял что чтобы получить доступ к глобальной переменной из макроса её нужно просто указать внутри <[]> как обычный код,
Не савсем. По умолчанию будет работать гигиена и все имена объявленные внутри макроса будут переименовываться (к ним будет добаляться номер "цвета"). Здесь
сказано как это обойти.
FDS>например вызов глобальных функций Exec
Вызовы будут рабтать и так. Тут речь идет только о вводимых в макросах переменных.
FDS> и т.п. и создание локальной переменной mutexs, видной только в области определения именно этого макроса, будет выглядеть как-то так
FDS>
В данном случае mutexs как раз будет превращаться в автоматически переименовываемую переменную (которая не пересечется с такой же из другого контекста). Так что можно было бы просто этого не делать, так как по умолчанию имена переменных и так уникальны. Если нужен доступ к переменным из области объявления, то их нужно передавать как переменные (т.е. mutexs должен был быть вычленен из переданного кода), объявляться с использованием $(... : usesite), или нужно модифицировать контес с помощью фунции Manager.MacroColors.PushUseSiteColor().
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, FDSC, Вы писали:
VD>Зачем так оверквотить?
Что, сильно? Я просто всегда забываю, что было до этого и когда убирают цитаты, меня обычно разражает сильно
VD>Ну, и что мешает добавит их? С ними стиль будет ближе к стандартным макросам.
А если мне хочется, что бы это была именно конструкция без скобок? Ещё одни скобки, лишние символы... просто удобнее было бы
В принципе, мне, например, вообще не хватает Matlab-овского (или хотя бы PL-евского) синтаксиса, когда можно написать k = A(1:6, 2:5) и в итоге из A скопируются данные с 1-ой по 6-ую строки со 2-ого по 5-ый столбец... всё-таки это было бы удобнее, в конце концов Nemerle не только функциональный язык
А как такое сделать, я вообще не представляю, опять, наверняка будут какие-нибудь заморочки и ничего нормально не получится
VD>Не савсем. По умолчанию будет работать гигиена и все имена объявленные внутри макроса будут переименовываться (к ним будет добаляться номер "цвета"). Здесь
Здравствуйте, 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
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];
}
Ну, перемножение можно сделать и функцией, но бывают вещи по сложнее, которые с "векторным" синтаксисом выглядят гораздо лучше. Вот у меня впечатление, что сделать такую вещь с помощью макросов в Немерле невозможно...
Только вот делать из Nemerle J или Matlab, наверное, не стоит.
FDS>На Nemerle (без макросов) это выглядит так:
... FDS>Ну, перемножение можно сделать и функцией, но бывают вещи по сложнее, которые с "векторным" синтаксисом выглядят гораздо лучше. Вот у меня впечатление, что сделать такую вещь с помощью макросов в Немерле невозможно...
Да, на Немерле далеко не все возможно, но так ли это плохо? Нужны мега-вычисления, возьми J или Matlab, нужны логические вычисления — пролог в руки, благо и то и то имеет возможность интегрироваться с .NET
В MatLab то же так можно, я показал суммирование в общем виде, когда можно брать только те столбцы, которые хочешь
ie>Только вот делать из Nemerle J или Matlab, наверное, не стоит.
ie>Да, на Немерле далеко не все возможно, но так ли это плохо? Нужны мега-вычисления, возьми J или Matlab, нужны логические вычисления — пролог в руки, благо и то и то имеет возможность интегрироваться с .NET
Хм. Это, конечно, можно, но мне Немерле понравился. Да и потом, J — совершенно незнакомый язык и, вполне возможно, там нет вложенных функций, а MatLab вообще страдает производительностью
Здравствуйте, 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