Замечания и предложения


#527

Невозможно. Компилятор - слишком сложная структура.


#528

Я просто наивно полагал, что так как Вы используете Yacc, это всё-таки проще, чем лезть в какой-нибудь Free Pascal.


#529

Что значит против воли добавить. Он написал в книжке не надо использовать, кто использует - сам виноват, зачем убирать конструкцию.


#530

Yacc - это только парсер. А вся семантика, которую Вы хотите делать, - сложна


#531

Да, там семантика неуклюжая может получиться. Но разве в данном конкретном случае нельзя просто поменять аргументы в выражениях типа

($2 as statement_list).right_logical_bracket = $3;

или просто ввести функцию которая заключает в логические скобки узел, если последнему аргументу не за что “зацепиться” с самим узлом качестве аргумента?


#532

Не понимаю все же. Во всех нормальных языках нельзя делать то, чего Вы так страстно возжелали. Но Вы со странным упорством уже несколько суток продолжаете “долбить”, как Вам ну просто необходимо сделать именно так. Причем нужно это Вам, да еще, быть может 1-2 людям на планете. Вашу бы энергию - да в мирных целях…


#533

Перфекционизм, вроде называется. Вот PascalScript не позволял писать массивы a[x,y], принимал только a[x][y] синтаксис. Не вынес, допилил, сделал “как надо”


#534

Перфекционизм хорош, пока он направлен внутрь себя и не выносит мозг другим.


#535

Наверное правда, пора закрывать тему, сил у меня на самом деле не особо. Спорить о том, что лучше С и его последователи по синтаксису или Паскаль, ну это же явно провокационная тема на форуме по продукту где Паскаль пишется на C#. Но из “свеженького”, в Q# такая конструкция как я описал вроде позволена (в конце посмотрите).


#536

А приведите код здесь


#537
using ancilla = Qubit[1] {
    repeat {
        let anc = ancilla[0];
        H(anc);
        T(anc);
        CNOT(target,anc);
        H(anc);
        (Adjoint T)(anc);
        H(anc);
        T(anc);
        H(anc);
        CNOT(target,anc);
        T(anc);
        Z(target);
        H(anc);
        let result = M([anc],[PauliZ]);
    } until result == Zero
    fixup {
        ();
    }
}

#538

А что вы будете делать в этом случае:

repeat
  if False then
  begin
    var x := 5;
  end
until x=0;

#539

Да нет же, речь шла о том чтоб разрешить это:

repeat
  var ch := ReadChar;
until ch=ExitChar;

, без внутреннего блока… В вашем случае - если условие в if then не выполнится - x не будет инициализирована, а в коде, который я в этом сообщении написал, ch в любом случае будет инициализировано до того как код дойдёт до until.


#540

А разница какая?

Это насколько ж нерегулярный язык надо придумать, чтобы без внутреннего блока можно было, а с внутренним нельзя!

Ладно. Вот:

repeat
    goto haha;
    var x := 5;
haha:
until x=0;

#541
begin
  begin
    var i := 5;
  end;
  writeln(i);
end.

То что это не компилируется - тоже значит “нерегулярно”?))

Так не честно! Вы использовали метки! Я ведь тоже так могу…

label l1;

begin
  goto l1;
  var i := 5;
  l1:
  Writeln(i);
end.

Ну а если серьёзно - метки особый случай. Они поддерживаются только для совместимости. Их должно читать из написанного ранее кода, но использовать их в новых программах - плохой тон, как и с глобальными переменными.


#542

Да ну, бросьте - никакой это не плохой тон! Это только боязливые школьные учительницы не используют goto и школьников этому учат. И глобальные переменные тоже вполне нормальны, но в меру


#543
Употребление слов из четырёх букв типа "go to" может иногда быть уместным даже
в самом лучшем обществе
             (Donald E. Knuth. "Structural Prigramming with go to Statement")

Беда лишь в том, что go to предполагает наличие метки, а некоторые господа, “имя которых слишком хорошо известно, чтобы его называть” (с) эти самые метки запретили в соединении с лямбдами. Причем строго запретили, даже если переходы делаются в области, где нет ни одной лямбды. Поэтому разговор о go to в PascalABC.NET - он на самом деле как бы такой… восхитительно бесполезный.


#544

Спасибо за дельное пожелание. Я когда-то рассматривал такую возможность, но трудоёмкость даже чисто с точки зрения набивки получается большая. Это же не ради самого процесса делается. Смотрел ещё MPS но там Java, а где-то болтается С# в процессе развития. Вот seed7 ещё нашёл, но там меток конечно нет и переменные локальные по всему коду не разбрасываются, по крайней мере в дефолтной версии поставляемой по умолчанию. Да я наверное обойдусь старым стилем, как тут советовали. Даже сделал себе версию PascalABC.NET с подавленным предупреждением при использовании обычного for без всяких var-ов, то при компиляции программ переделанных с обычных Паскалей это предупреждение забивает все остальные.


#545

Только эти “боязливые школьные учительницы” не знают ничего кроме глобальных переменных. Даже запись

Procedure Swap(Var a: Int32; Var b: Int32);
Begin
  Var Temp: Int32;
...

вызывает у них полное недоумение.


#546

У меня тоже. В PascalABC.NET нет типа Int32.