LINUX.ORG.RU

Нужен совет по придумыванию синтаксиса

 ,


0

4

Какой из двух вариантов управляющих конструкций вам нравится больше и почему? Сопоставьте как с известными вам различными императивными языками, так и собственными представлениями о гармоничности.

ПЕРВЫЙ:

// циклы с предусловием:

while condition do
    statements
end:while

until condition do
    statements
end:until

// циклы с постусловием:

do
    statements
repeat while condition;

do
    statements
repeat until condition;

// вечный цикл:

do
    statements
repeat forever;

// простой блок кода:

block
    statements
end:block

ВТОРОЙ:


// циклы с предусловием:

while condition loop
    statements
end:while

until condition loop
    statements
end:until

// циклы с постусловием:

loop
    statements
repeat while condition;

loop
    statements
repeat until condition;

// вечный цикл:

loop
    statements
repeat forever;

// простой блок кода:

do
    statements
end:do
★★

Последнее исправление: wandrien (всего исправлений: 1)

Есть еще промежуточный вариант, как первый, но с ключевым словом loop вместо repeat. Немного в стиле бейсика тогда получается:

// циклы с постусловием:

do
    statements
loop while condition;

do
    statements
loop until condition;

// вечный цикл:

do
    statements
loop forever;
wandrien ★★
() автор топика
Ответ на: комментарий от alysnix

Это работает только если не делать цикла с предусловием, который начинается словом until.

То есть вернуться к циклам в стиле Оберона:

while ... do ... end и repeat ... until ...

wandrien ★★
() автор топика
Ответ на: комментарий от wandrien

«предусловие» это проверка ПЕРЕД выполнением цикла. если вы ставите until перед циклом, вы должны вменяемо обьяснить, что условие будет проверено только после первого выполнения тела цикла. то есть оно является постусловием для тела цикла.

потому постусловие ставят в конец цикла, и ничто никому не надо обьяснять.

alysnix ★★★
()
Ответ на: комментарий от alysnix

Предусловие это предусловие. Я не знаю, откуда вы придумали, что предусловие стало постусловием. Это ваша фантазия.

Как обычно на ЛОРе, вместо того, чтобы говорить о предмете топика, приходится рассказывать сначала, что вода мокрая, а Солнце встаёт на востоке.

wandrien ★★
() автор топика

Ни тот ни другой вариант особо не нравятся. Идею понял, и не понимаю, чем until в предусловии лучше, чем while + not — зачем городить сложности на ровном месте.

Но если уж хочется, почему бы тогда не так, например:

// циклы с предусловием:

while condition do
    statements
end:while

until condition do
    statements
end:until

// циклы с постусловием:

do
    statements
while condition; // однозначность достигается благодаря отсутствию ключевого слова do 

do
    statements
until condition;

// вечный цикл:

do
    statements
forever;

// простой блок кода:

do
    statements
once;
CrX ★★★
()
Ответ на: комментарий от CrX

Как я понял, он хочет until в качестве сахара для while not, чтоб литературнее было. Но может я неправ.

видимо не врубается что предусловие until это инверсия условия в while.

alysnix ★★★
()
Ответ на: комментарий от CrX

Ни тот ни другой вариант особо не нравятся. Идею понял, и не понимаю, чем until в предусловии лучше, чем while + not — зачем городить сложности на ровном месте.

В общем, ситуация такая.

Мне вообще until не особо нужен. Сишные циклы вида while (expr) stmt и do stmt while (expr) оба с прямым условием лично меня бы вполне устроили.

Но так как в рамках заданного подхода к синтаксису всё равно нужно решать неоднозначность с while, то можно ввести также в язык и until, если это «бесплатно». Английским натив спикерам он, видимо, вполне удобен.

Но если уж хочется, почему бы тогда не так, например:

Это красивый лаконичный вариант, но он не отвечает исходной задаче: давать как можно больше зацепок для глаз, указывающих на структуру кода и её управляющие конструкции.

Идею с do forever и do once я оценил. Это круто. Однако требуется обеспечить избыточность кодирования. Это не только чисто формальное требование для парсера, но и принцип проектирования в данном случае.

wandrien ★★
() автор топика
Ответ на: комментарий от wandrien

афтар циклы делятся на циклы с предусловием, с постусловием и бесконечные. и цикл типа for.

циклы с предусловием обычно описываются конструкцией while.

с постуcловием - until. (но можно и while(но с ним сложней) - зависит от вкусов автора, тогда условие инвертируется)

бесконечный - лучше эмулировать уже имеющимся, типа while true…, чтобы не брать еще одно лишнее слово в зарезервированные.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от CrX
do
    statements
forever;

// простой блок кода:

do
    statements
once;

так не нуна. введено два ключевых слова, просто так.

бесконечный цикл это

while true do ... end

просто блок можно писать как

do...end
alysnix ★★★
()
Ответ на: комментарий от masa

Мне нравятся языки со скобочками {} и отступами, «end» это уродство из паскаля и всяких башей

У каждого подхода есть свои плюсы и минусы. Текстовые блоки более читабельны и логичны, но при этом громоздки и многословны.

Блоки со скобочками просты в написании, состоят преимущественно из двух символов, но при этом логичность написанного теряется, разбираться в наборе символов тяжелее, чем читать логически сконструированный текст, это становится особенно заметно, когда код пишется не в Олмановском стиле.

Dr64h ★★
()
Ответ на: комментарий от wandrien

когда я увлекался такими штучками как вы, любезный, я просто сделал символ do == {, end == } и можно было невозбранно писать

if a>b do ... end
if a>b { ... }

while true { }
while true do end
alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)

Если тебе нравится синтаксис паскаля - то и возьми синтаксис паскаля, зачем придумывать «как паскаль, но другой»?

anonymous
()
Ответ на: комментарий от alysnix

когда я увлекался такими штучками как вы, любезный,

Чем вы сейчас увлекаетесь, так это телепатией при нерабочем libastral. Уже третья ваша попытка в этой теме пальцем в небо.

я просто сделал символ do == {, end == } и можно было невозбранно писать

Поздравляю, вы изобрели паскаль.

wandrien ★★
() автор топика
Ответ на: комментарий от Dr64h

У каждого подхода есть свои плюсы и минусы. Текстовые блоки более читабельны и логичны, но при этом громоздки и многословны.

Верно, в рамках проекта избыточность это фича, а не баг. Для этой фичи используется структура управляющих конструкций, похожая на применяемую в Ada и Visual Basic, которые были также ориентированы на избыточность. Но творчески переботанная.

wandrien ★★
() автор топика
Ответ на: комментарий от alysnix

Я-то kbxyj согласен. Но я именно следовал идее ТС и ввёл не больше ключевых слов, чем было.

Лично мне-то эта идея в принципе не нравится. Отсутствие «скобок» в каком-то едином виде (будь то {} или паскалевские begin/end, или питоновские отступы) для всех типов блоков на практике неудобно. Мне эти Lua та же не нравится со своим end, завершающим что-то, начало чего может быть обозначено тучей способов. У ТС чуть получше, потому что после end следует хотя бы что оно завершает, но всё равно громоздко слишком.

CrX ★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от wandrien

вам похоже рано заниматься синтаксисом нового языка. вы сначала сформулируйте идею, которые вы хотели бы реализовать в виде «синтаксиса».

синтаксис это просто форма. содержание-то, которое вы хотите влить в эту форму, у вас есть?

alysnix ★★★
()
Ответ на: комментарий от alysnix

Вас забыл спросить, чем мне заниматься. =)

У меня нет задачи доносить идеи до непонятливых. Вот в этой теме два человека суть идеи прекрасно уловили из предоставленных вариантов.

wandrien ★★
() автор топика
Ответ на: комментарий от wandrien

Для этой фичи используется структура управляющих конструкций, похожая на применяемую в Ada и Visual Basic, которые были также ориентированы на избыточность. Но творчески переботанная.

не на «избыточность», а на verbosity. на читаемость и близость к естественной речи.

избыточности никто в языках обычно не допускает, а если и допускает, то в целях, вам пока неведомых.

alysnix ★★★
()
Ответ на: комментарий от wandrien

Есть еще промежуточный вариант, как первый, но с ключевым словом loop вместо repeat.

Пока склоняюсь к этому варианту.

Примеры кода.

Текущее состояние:

    /* Check the cases for the operands arrived in swapped order: */
    if fSwap==1 then
        do
            /* We can handle it by changing the operation ID */
            word swappedID = CheckOperationSwappable(ID);
            if swappedID != 0 then
                ID = swappedID;
                exit;
            end:if

            /* We can handle it by swapping operands back. */
            switch ID of
            case iSUB, iDIV, iMOD:
                Emit(@CodeCmdRegReg(@Buff, "xchg", Reg_TARGET, 4, rightReg, 4));
                exit;
            end:switch

            /* If the operation is commutative, we don't care about the order. */
            when IsOperationCommutative(ID):
                exit;

            /* In other cases, swapped operands shouldn't happen. */
            StopInternalCodegen(__FILE__, __LINE__);
        end:do
    end:if

Планируемое после устаканивания синтаксиса управляющих структур:

    /* Check the cases for the operands arrived in swapped order: */
    if fSwap==1 then
        block
            /* We can handle it by changing the operation ID */
            word swappedID = CheckOperationSwappable(ID);
            if swappedID != 0 then
                ID = swappedID;
                exit block;
            end:if

            /* We can handle it by swapping operands back. */
            switch ID of
            case iSUB, iDIV, iMOD:
                Emit(@CodeCmdRegReg(@Buff, "xchg", Reg_TARGET, 4, rightReg, 4));
                exit block;
            end:switch

            /* If the operation is commutative, we don't care about the order. */
            when IsOperationCommutative(ID):
                exit block;

            /* In other cases, swapped operands shouldn't happen. */
            StopInternalCodegen(__FILE__, __LINE__);
        end:block
    end:if

Текущее состояние:

    Scan(@Buff);
    while strcmp(@Buff,")")!=0 do
        word pType = Find(@Buff);
        when pType >= nDICT | Dict[pType].Class != cTYPE:
            Stop(@eTYPEEXP);

        do
            Scan(@Buff);
            word nPtr=ReadPtrs(@Buff);

            when pType == st_void & nPtr<1:
                Stop(@eNOVOID);
            when Dict[pType].Sub == sFUNCTYPE & nPtr<1:
                Stop(@eNOVAL);

            word pARG = FindInNamespace(@Buff, pARGS);
            when pARG < nDICT:
                StopWithSubject(@eDUPLICATE, @Buff);

            pARG = DictAlloc();
            DictSetName(pARG, @Buff);
            Dict[pARG].Class = cARG;
            Dict[pARG].pType = T_nPtrTo(nPtr, pType);
            DictAddToNamespace(pARG, pARGS);

            when strcmp(@Scan(@Buff),",")!=0:
                exit;
        end

        if strcmp(@Buff,")")!=0 then
            when strcmp(@Buff,";") != 0:
                Stop(@eSEMICOLONEXP);
            when strcmp(@Scan(@Buff),")") == 0:
                Stop(@eTYPEEXP);
        end

    end:while

Планируемое после устаканивания синтаксиса управляющих структур:

    Scan(@Buff);
    while strcmp(@Buff,")")!=0 do
        word pType = Find(@Buff);
        when pType >= nDICT | Dict[pType].Class != cTYPE:
            Stop(@eTYPEEXP);

        do
            Scan(@Buff);
            word nPtr=ReadPtrs(@Buff);

            when pType == st_void & nPtr<1:
                Stop(@eNOVOID);
            when Dict[pType].Sub == sFUNCTYPE & nPtr<1:
                Stop(@eNOVAL);

            word pARG = FindInNamespace(@Buff, pARGS);
            when pARG < nDICT:
                StopWithSubject(@eDUPLICATE, @Buff);

            pARG = DictAlloc();
            DictSetName(pARG, @Buff);
            Dict[pARG].Class = cARG;
            Dict[pARG].pType = T_nPtrTo(nPtr, pType);
            DictAddToNamespace(pARG, pARGS);

        loop until strcmp(@Scan(@Buff),",")!=0;

        if strcmp(@Buff,")")!=0 then
            when strcmp(@Buff,";") != 0:
                Stop(@eSEMICOLONEXP);
            when strcmp(@Scan(@Buff),")") == 0:
                Stop(@eTYPEEXP);
        end

    end:while
wandrien ★★
() автор топика
Последнее исправление: wandrien (всего исправлений: 1)

а мне вообще перестают нравится циклы :-) они существенно выставляют по скорости

но если от них никуда, скобки {} не нравятся, то pascal-style и не придумывать новый неизвестный другим синтаксис.

MKuznetsov ★★★★★
()
Последнее исправление: MKuznetsov (всего исправлений: 1)
Ответ на: комментарий от wandrien
    if fSwap==1 then
        block

        end:block
    end:if

чувак, end приделывают к then для того, чтобы получить блок кода, и тогда не надо писать begin…end

у тебя же и есть end:if, и вложен блок, фиг знает зачем. это новое слово тащемта.

alysnix ★★★
()
Ответ на: комментарий от wandrien

До меня тоже не доходит. Почему во внешнем цикле block, а во вложенном без:

            if swappedID != 0 then
                ID = swappedID;
                exit block;
            end:if

В чём тайный смысл этого block в данном случае? Я бы понял, если бы он именованным был, например…

CrX ★★★
()
Ответ на: комментарий от wandrien

ну поведай миру, зачем в твоем синтаксисе в блок, образуемый парой then - end:if, тут же вкладывается еще один блок - парой block … end:block.

ты, где видел такой синтаксис вообще?

alysnix ★★★
()

Особой разницы не вижу. Непривычно и *многословно*.
Но, все же, предпочел бы вариант с do/while_do, так как он кажется просто привычней после опыта с Турбо Паскакалем и Делфи в юности.

urxvt ★★★★★
()
Ответ на: комментарий от wandrien

А если блоки вложенные будут, как понять из какого exit? Предполагаю, что из внутреннего, конечно. Но как-то это куце получается.

Я бы понял, если бы он именованным был, например…

CrX ★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от CrX

Я бы понял, если бы он именованным был, например…

Будут.

При чем скорее всего выглядеть это может даже так:

my_cool_loop:
while condition do

    when что-то там:
        exit my_cool_loop;

end:my_cool_loop

wandrien ★★
() автор топика
Ответ на: комментарий от wandrien

Да, но там, собственно, каждый раз что-то типа блока, обозначается {}. Ну и это конкретно break, и конкретно из цикла. А тут целое ключевое слово только ради того, чтобы можно было делать так же, да ещё и этот block может быть объявлен на любом уровне, хоть внутри цикла, хоть вне его? А смысл? Если уж городить block, то идти дальше, позволить давать блокам имена и иметь возможность для exit указывать прямо, из какого выходить.

CrX ★★★
()