История изменений
Исправление 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 и делает их создание супер простым.
Если знаком с лиспом то это как будто если бы каждый список по-умолчанию был заквочен.