LINUX.ORG.RU

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

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

Надо прояснить несколько вещей чтобы понять как с этим работать :)

Ну то есть расставить скобки, хотя они и не нужны?

Да, в целом можно ставить скобки чтобы наверняка.

Как сделано взаимодействие функций и операторов? Допустим, я хочу записать как-то так:

digit: non-zero | charset «0»

Тут нет операторов в общем смысле, в изначальном примере есть только charset значения, вот эта штука

byte: [
  "25" half
| "2" four digit
| "1" digit digit
| non-zero digit
| digit
]

лишь создает «блок» данных, типа массив с разными элементами, строками и словами в терминологии red типа | и half:

>> byte/1
== "25"
>> byte/2
== half
>> byte/3
== |

Можно смотреть на это как на набор данных, внутри блока по-умолчанию ничего не вычисляется. А в конце функция parse разбирает эти данные на основе правил типа PEG и выполняет матчинг. Так что твой приведенный код можно записать так:

digit: compose [non-zero | (charset "0")]

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

То есть по-сути весь код на red это набор блоков, и они передаются некому вычислителю который решает что с ними сделать.

Например создание функции: z: func [x y] [x + y] это функция которая принимает 2 блока: аргументы и тело и создает из них внутреннее представление которое может вызываться. Таким образом язык полностью состоит из DSL и делает их создание супер простым.

Если знаком с лиспом то это как будто если бы каждый список по-умолчанию был заквочен.

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

Надо прояснить несколько вещей чтобы понять как с этим работать :)

Ну то есть расставить скобки, хотя они и не нужны?

Скорее всего можно но я не помню точно.

Как сделано взаимодействие функций и операторов? Допустим, я хочу записать как-то так:

digit: non-zero | charset «0»

Тут нет операторов в общем смысле, в изначальном примере есть только charset значения, вот эта штука

byte: [
  "25" half
| "2" four digit
| "1" digit digit
| non-zero digit
| digit
]

лишь создает «блок» данных, типа массив с разными элементами, строками и словами в терминологии red типа | и half:

>> byte/1
== "25"
>> byte/2
== half
>> byte/3
== |

Можно смотреть на это как на набор данных, внутри блока по-умолчанию ничего не вычисляется. А в конце функция parse разбирает эти данные на основе правил типа PEG и выполняет матчинг. Так что твой приведенный код можно записать так:

digit: compose [non-zero | (charset "0")]

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

То есть по-сути весь код на red это набор блоков, и они передаются некому вычислителю который решает что с ними сделать.

Например создание функции: z: func [x y] [x + y] это функция которая принимает 2 блока: аргументы и тело и создает из них внутреннее представление которое может вызываться. Таким образом язык полностью состоит из DSL и делает их создание супер простым.

Если знаком с лиспом то это как будто если бы каждый список по-умолчанию был заквочен.

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

Надо прояснить несколько вещей чтобы понять как с этим работать :)

Ну то есть расставить скобки, хотя они и не нужны?

Скорее всего можно но я не помню точно.

Как сделано взаимодействие функций и операторов? Допустим, я хочу записать как-то так:

digit: non-zero | charset «0»

Тут нет операторов в общем смысле, в изначальном примере есть только charset значения, вот эта штука

byte: [ «25» half | «2» four digit | «1» digit digit | non-zero digit | digit ]

лишь создает «блок» данных, типа массив с разными элементами, строками и словами в терминологии red типа | и half:

byte/1 == «25» byte/2 == half byte/3 == |

Можно смотреть на это как на набор данных, внутри блока по-умолчанию ничего не вычисляется. А в конце функция parse разбирает эти данные на основе правил типа PEG и выполняет матчинг. Так что твой приведенный код можно записать так:

digit: compose [non-zero | (charset «0»)]

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

То есть по-сути весь код на red это набор блоков, и они передаются некому вычислителю который решает что с ними сделать.

Например создание функции: z: func [x y] [x + y] это функция которая принимает 2 блока: аргументы и тело и создает из них внутреннее представление которое может вызываться. Таким образом язык полностью состоит из DSL и делает их создание супер простым.

Если знаком с лиспом то это как будто если бы каждый список по-умолчанию был заквочен.

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

Надо прояснить несколько вещей чтобы понять как с этим работать :)

Ну то есть расставить скобки, хотя они и не нужны?

Скорее всего можно но я не помню точно.

Как сделано взаимодействие функций и операторов? Допустим, я хочу записать как-то так:

digit: non-zero | charset «0»

Тут нет операторов в общем смысле, в изначальном примере есть только charset значения, вот эта штука

byte: [ «25» half | «2» four digit | «1» digit digit | non-zero digit | digit ]

лишь создает «блок» данных, типа массив с разными элементами, строками и словами в терминологии red типа | и half:

byte/1 == «25» byte/2 == half byte/3 == |

Можно смотреть на это как на набор данных, внутри блока по-умолчанию ничего не вычисляется. А в конце функция parse разбирает эти данные на основе правил типа PEG и выполняет матчинг. Так что твой приведенный код можно записать так:

digit: compose [non-zero | (charset «0»)]

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

То есть по-сути весь код на red это набор блоков, и они передаются некому вычислителю который решает что с ними сделать.

Например создание функции: z: func [x y] [x + y] это функция которая принимает 2 блока: аргументы и тело и создает из них внутреннее представление которое может вызываться. Таким образом язык полностью состоит из DSL и делает их создание супер простым.

Если знаком с лиспом то это как будто если бы каждый список по-умолчанию был заквочен.

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

Надо прояснить несколько вещей чтобы понять как с этим работать :)

Ну то есть расставить скобки, хотя они и не нужны?

Скорее всего можно но я не помню точно.

Как сделано взаимодействие функций и операторов? Допустим, я хочу записать как-то так:

digit: non-zero | charset «0»

Тут нет операторов в общем смысле, в изначальном примере есть только charset значения, вот эта штука

byte: [
  "25" half
| "2" four digit
| "1" digit digit
| non-zero digit
| digit

]

лишь создает «блок» данных, типа массив с разными элементами, строками и словами в терминологии red типа | и half:

byte/1 == «25» byte/2 == half byte/3 == |

Можно смотреть на это как на набор данных, внутри блока по-умолчанию ничего не вычисляется. А в конце функция parse разбирает эти данные на основе правил типа PEG и выполняет матчинг. Так что твой приведенный код можно записать так:

digit: compose [non-zero | (charset «0»)]

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

То есть по-сути весь код на red это набор блоков, и они передаются некому вычислителю который решает что с ними сделать.

Например создание функции: z: func [x y] [x + y] это функция которая принимает 2 блока: аргументы и тело и создает из них внутреннее представление которое может вызываться. Таким образом язык полностью состоит из DSL и делает их создание супер простым.

Если знаком с лиспом то это как будто если бы каждый список по-умолчанию был заквочен.

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

Надо прояснить несколько вещей чтобы понять как с этим работать :)

Ну то есть расставить скобки, хотя они и не нужны?

Скорее всего можно но я не помню точно.

Как сделано взаимодействие функций и операторов? Допустим, я хочу записать как-то так: digit: non-zero | charset «0»

Тут нет операторов в общем смысле, в изначальном примере есть только charset значения, вот эта штука

byte: [ «25» half | «2» four digit | «1» digit digit | non-zero digit | digit ]

лишь создает «блок» данных, типа массив с разными элементами, строками и словами в терминологии red типа | и half:

byte/1 == «25» byte/2 == half byte/3 == |

Можно смотреть на это как на набор данных, внутри блока по-умолчанию ничего не вычисляется. А в конце функция parse разбирает эти данные на основе правил типа PEG и выполняет матчинг. Так что твой приведенный код можно записать так:

digit: compose [non-zero | (charset «0»)]

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

То есть по-сути весь код на red это набор блоков, и они передаются некому вычислителю который решает что с ними сделать.

Например создание функции: z: func [x y] [x + y] это функция которая принимает 2 блока: аргументы и тело и создает из них внутреннее представление которое может вызываться. Таким образом язык полностью состоит из DSL и делает их создание супер простым.

Если знаком с лиспом то это как будто если бы каждый список по-умолчанию был заквочен.