LINUX.ORG.RU

История изменений

Исправление SZT, (текущая версия) :

а какой смысл запрещать частные случаи?

Для однородности. Вообще, если по хорошему, любой цикл реализуется через if (условие) goto метка и никакие циклы попросту не нужны.

Но! Можно вводить какие угодно свои представления кода, и с ними работать, потом они все равно при компиляции во что-то там одинаковое развернутся компилятором. Это не принципиально.

Типа, написали мы код (представление 1)

(do_while
(
  (//код)
  (//код)
)
(a != x))

А развернется оно в что-то вроде (п. 2)

(##label)
(//код)
(//код)
(ifgoto (a != x) ##label)

но работать (трансформировать) можно при желании и 1, и 2 п.

Иными словами, можно вводить поверх (##label) (ifgoto (a != x) ##label) свой синтаксический сахар, и с этим сахаром выполнять какие-то свои трансформации, а потом этот сахар можно «преобразовать» обратно в сырой вид с goto и прочим.

Можно взять некий код, и попробовать его развернуть, например

(for (:= i 0) (< i 1000) (+= i 1)
(
  (//код, который не меняет значения i)
)
)

преобразовать к виду

(:= i 0)
(while (< i 1000)
(
  (//код, который не меняет значения i)
  (+= i 1)
  (//код, который не меняет значения i)
  (+= i 1)
  (//код, который не меняет значения i)
  (+= i 1)
  (//код, который не меняет значения i)
  (+= i 1)
  (//код, который не меняет значения i)
  (+= i 1)
)
)

Потом он уже преобразуется в какой-то там ifgoto но работать можно и с таким представлением

Исправление SZT, :

а какой смысл запрещать частные случаи?

Для однородности. Вообще, если по хорошему, любой цикл реализуется через if (условие) goto метка и никакие циклы попросту не нужны.

Но! Можно вводить какие угодно свои представления кода, и с ними работать, потом они все равно при компиляции во что-то там одинаковое развернутся компилятором. Это не принципиально.

Типа, написали мы код (представление 1)

(do_while
(
  (//код)
  (//код)
)
(a != x))

А развернется оно в что-то вроде (п. 2)

(##label)
(//код)
(//код)
(ifgoto (a != x) ##label)

но работать (трансформировать) можно при желании и 1, и 2 п.

Иными словами, можно вводить поверх (##label) (ifgoto (a != x) ##label) свой синтаксический сахар, и с этим сахаром выполнять какие-то свои трансформации, а потом этот сахар можно «преобразовать» обратно в сырой вид с goto и прочим.

Можно взять некий код, и попробовать его развернуть, например

(for (:= i 0) (< i 1000) (+= i 1)
(
  (//код, который не меняет значения i)
)
)

преобразовать к виду

(while (< i 1000)
(
  (//код, который не меняет значения i)
  (+= i 1)
  (//код, который не меняет значения i)
  (+= i 1)
  (//код, который не меняет значения i)
  (+= i 1)
  (//код, который не меняет значения i)
  (+= i 1)
  (//код, который не меняет значения i)
  (+= i 1)
)
)

Потом он уже преобразуется в какой-то там ifgoto но работать можно и с таким представлением

Исходная версия SZT, :

а какой смысл запрещать частные случаи?

Для однородности. Вообще, если по хорошему, любой цикл реализуется через if (условие) goto метка и никакие циклы попросту не нужны.

Но! Можно вводить какие угодно свои представления кода, и с ними работать, потом они все равно при компиляции во что-то там одинаковое развернутся компилятором. Это не принципиально.

Типа, написали мы код (представление 1)

(do_while
(
  (//код)
  (//код)
)
(a != x))

А развернется оно в что-то вроде (п. 2)

(##label)
(//код)
(//код)
(ifgoto (a != x) ##label)

но работать (трансформировать) можно при желании и 1, и 2 п.

Иными словами, можно вводить поверх (##label) (ifgoto (a != x) ##label) свой синтаксический сахар, и с этим сахаром выполнять какие-то свои трансформации, а потом этот сахар можно «преобразовать» обратно в сырой вид с goto и прочим.

Можно взять некий код, и попробовать его развернуть, например

(for (:= i 0) (< i 1000) (+= i 1)
(
  (//код, который не меняет значения i)
)
)

преобразовать к виду

(while (< i 1000)
(
  (//код, который не меняет значения i)
  (+= i 1)
  (//код, который не меняет значения i)
  (+= i 1)
  (//код, который не меняет значения i)
  (+= i 1)
  (//код, который не меняет значения i)
  (+= i 1)
  (//код, который не меняет значения i)
  (+= i 1)
)
)

Потом он уже преобразуется в какой-то там (##label) (ifgoto (a != x) ##label) но работать можно и с таким представлением