Привет всем!
Вот такая нехитрая программка валит компилятор в первой строчке сопоставления. Если where на when попрваить и = на ==, то всё окей.
Перед тем как слать отчёт об ошибке хотел узнать это только у меня или у всех?
using System.Console;
using PT = Nemerle.Compiler.Parsetree;
namespace Test
{
module Program
{
public ExtractParamExpression( expressions : list[PT.PExpr],
paramName : string,
defaultExpression : PT.PExpr = null ) : PT.PExpr
{
def extract( _ )
{
| <[ $(p : name) = $expr ]> :: _ where p.Id = paramName => expr;
| _ :: exprs => extract( exprs );
| [] => defaultExpression;
| _ => Message.Fatal( "Unexpected element in attribute initialization list" );
}
extract( expressions );
}
Main() : void
{
}
}
}
Здравствуйте, SergASh, Вы писали:
SAS>Перед тем как слать отчёт об ошибке хотел узнать это только у меня или у всех?
А ты компилируешь это дело в макро-сборке или в обычной?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Здравствуйте, VladD2, Вы писали:
VD>А ты компилируешь это дело в макро-сборке или в обычной?
Первый раз обнаружил в макросборке, потом попробовал упростить и перенёс в обычную. С тем же результатом.
Вот проще пример, без макросов, на котором воспроизводится ошибка.
public Test() : void
{
def check( _ )
{
| d where d = 0 => true;
| _ => false;
}
}
Здравствуйте, SergASh, Вы писали:
SAS>Вот проще пример, без макросов, на котором воспроизводится ошибка.
SAS>SAS>public Test() : void
SAS>{
SAS> def check( _ )
SAS> {
SAS> | d where d = 0 => true;
SAS> | _ => false;
SAS> }
SAS>}
SAS>
Вылетает только Студия или компиляция тоже?
Есил первое надо отрепортить баг к интелисенс-энжину, если второе, то в компилятор.
В таком случае конечно должно выдаваться сообщение об ошибе, но не вылет.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, SergASh, Вы писали:
SAS>>Вот проще пример, без макросов, на котором воспроизводится ошибка.
SAS>>SAS>>public Test() : void
SAS>>{
SAS>> def check( _ )
SAS>> {
SAS>> | d where d = 0 => true;
SAS>> | _ => false;
SAS>> }
SAS>>}
SAS>>
Насколько я разбираюсь в паттерн-мэтчинге, то это образец "Record"
Цитата из статьи
Образец «Запись»
Этот образец состоит из необязательных имени класса и ключевого слова where, за которым следуют один или более именованных образцов, разделенных запятыми и заключенных в круглые скобки. Он сопоставляется с любым экземпляром класса, значения полей которого сопоставимы с подобразцами.
using System.Console;
// Метаатрибут «Record» добавляет к классу реализацию конструктора,
// инициализирующего поля класса.
[Record]
class Foo
{
public Number : int;
public Name : string;
}
def StringOfFooMatch(foo : Foo) : string
{ | Foo where (Name = "", Number = k) => k.ToString()
| (Name = s) => s
}
WriteLine(StringOfFooMatch(Foo(10, "")));
WriteLine(StringOfFooMatch(Foo(1, "Ivan")));
SergASh, видимо, хотел наложить ограничивающее условие. Это делается с помощщью ключевого слова when после которого идет булево выражение. Я думаю, так.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, SergASh, Вы писали:
SAS>Валится именно компилятор; я запускал и из командной строки, и из студии. Причём после закрытия окна Cancel/Debug сам NCC.EXE зависает.
Значит надо отрепортить баг компилятора.
... << RSDN@Home 1.2.0 alpha rev. 637>>