LINUX.ORG.RU

Red 0.6.3

 ,


4

6

Red — императивный функциональный язык программирования, представленный в 2011 году французским программистом Ненадом Ракоцевичем. Его синтаксис унаследован от интерпретируемого языка REBOL.

Цель создания Red — преодоление ограничений REBOL. По словам создателя, Red является «языком полного стека».

Red может использоваться как для высокоуровневого предметно-ориентированного программирования и создания графических интерфейсов, так и для низкоуровневого программирования операционных систем и драйверов.Его основные черты: простой синтаксис, гомоиконность, система макросов, статическая и JIT-компиляция, кросс-компиляция, малый размер исполняемых файлов (при отсутствии внешних зависимостей), REPL, возможность использовать как встраиваемый язык.

Данный релиз содержит порядка 800 исправлений и закрывает 86 задач. Одна из основных новостей — поддержка GUI под macOS с помощью нового бэкенда (что делает GUI полностью кросс-платформенным). Также можно отметить появление типа данных date!, расширения IO API, обновления LibRed.

>>> Подробности

★★★

Проверено: jollheef ()
Последнее исправление: sudopacman (всего исправлений: 4)

Ответ на: комментарий от matumba

1. Сопровождаемым. Вот самый первый фактор, выше всего, что ты мог себе представить! Просто умри, но код на этом языке должен читаться, модифицироваться, быть совместимым, легко переносимым (реюзабельным, слабо связанным), и т.п.

Ооо, вот на LINQ можно запросто наделать всякой нечитаемой ерунды. Кроме того, в шарпе ЕМНИП даже goto разрешен.

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

Не всегда можно понять алгоритм, но всегда можно понять код.

То же самое я могу сказать например про ANSI C

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

а что *ты* называешь гомоиконностью?

википедия гомоиконностью считает несколько иное, чем «код является данными»; я говорю про то, что код может быть данными, но его структура может совсем не 1-в-1 следовать AST

https://en.wikipedia.org/wiki/Homoiconicity дает опредление the AST and the syntax are isomorphic — впрочем, тут же рядом сразу идет и другое, куда более слабое, определение: the program's internal representation can be inferred by reading the text's layout

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

вот парочка наводящих вопросов (на тему «что *ты* считаешь гомоиконностью»); пусть язык позволяет операции над кодом, однако:

язык с со статическим приоритетом операторов является ли гомоиконным?

язык с приоритетами операторов, зависящими от типа данных, является ли гомоиконным?

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

Именно это и называю. Однородность кода и данных, возможность с кодом работать как с некоей структурой данных(а не тупо как с текстом), легко и удобно этот код читать и трансформировать средствами самого же языка. Строить из старого кода новый код. Чтоб можно было запросто metacircular evaluator сделать и в такой способ расширить/дополнить исходный язык.

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

на самом деле плохо понимаю, что же у вас там за условия такие, что просто не вариант продавить еще что-нибудь, окромя сисярпа?

Потому что ты - разработчик, а не бизнесмен. Получил зарплату - развернулся *опой и больше ни о чём у тебя голова не болит. А босс - у него люди, штат. У него заказчики, которые, классика, постоянно хотят «всё, задёшево и ещё вчера». Ты *потратил ресурсы*, набрал разработчиков, половину уволил и набрал ещё, пока не сформировалась команда мощных *сработавшихся* разрабов. Купил для них ПО, лицензии, железо, которое тянет это ПО, сервера всякие... Пока ты занимался *чисто административкой*, ты не заработал и цента, а уже потратил кучу бабла. И вот процесс более-менее пошёл, катятся релизы, теперь ты даже можешь более-менее прогнозировать сроки разработки (роскошь, которую могут себе позволить далеко не всякие коллективы, но которую ОЧЕНЬ любят заказчики).

Прочёл? А теперь посади себя в кресло босса, поставь перед собой нанятого очкарика-авангардиста и послушай его:

-Босс! Тут это... язык новый появился... «хрень-шарп», во! Там всё так круто, лямбды есть, шаблоны, паттерн-матчинг. А на этой неделе появилась либа для 3D! Давайте всё писать на «хрень-шарп»!

Тут бы боссу спросить:
# А сколько стоит твой язык? Ну, IDE, книги, курсы какие-нть.
# А сколько людей УЖЕ УМЕЮТ на нём писать? Какие они просят зарплаты в среднем по рынку? У меня вот команда сишарпщиков - что мне с ними делать? Сколько они потратят времени ВПУСТУЮ (т.е. не внося ценности в существующий проект), пока они научатся твоей шарпохрени?
# У меня написанного кода - 2 миллиона строк, которые мне (пока) не окупились, но уже вышли в 500,000 штук зелёных. Перспективные заказчики есть, но пока этот код построен на мои деньги. Ты готов поработать полгода забесплатно, но переписать этот код?
# Какой конкретно профит я получу от перехода на вашу «хрень-шарп»? Ваш код уменьшится хотя бы в ДВА РАЗА? А скорость его написания? Насколько я смогу обгонять конкурентов? А это компенсирует мне предыдущие вложения? А не останусь я у корыта с проектом, написанным хрен-знает-на-чём? Кто поддерживает ваш язык? Сколько других компаний приняли его в разработку?


Если ты сейчас не ржёшь над этим новатором-идиотом, ты НИЧЕГО не понимаешь в бизнесе. Здесь не вопрос «продавить» (типичный взгляд студоты), здесь вопрос А ЗАЧЕМ? Какой профит имеет бизнес с твоих подростковых амбиций? Вот в чём вопрос, тут надо иметь совершенно ортогональный взгляд.

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

язык с со статическим приоритетом операторов является ли гомоиконным?
язык с приоритетами операторов, зависящими от типа данных, является ли гомоиконным?

Это затрудняет анализ и транформацию такого кода (поменяем плюс на умножение или двоичный сдвиг где-то там, и уже что-то сломается т.к. с учетом приоритета операций оно считается уже не так, как мы бы хотели чтоб оно считалось, делая такого рода замену), но на факт наличия/отсутствия гомоиконности не влияет. Желательно все в скобки фигачить (s-expression), тогда проблема со всякими приоритетами операций сама собой отпадает (их просто не будет).

Есть и проблемы другого рода, например если (+ a b c d) и с флоатами это будет вычисляться как (+ a (+ b (+ c d))) а с даблами как (+ (+ (+ a b) c) d) то это будет не очень хорошо

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

Ооо, вот на LINQ можно запросто наделать всякой нечитаемой ерунды.

Можно. Но не нужно. Более того - наличие какой-то хрени в языке не гарантирует, что это вообще кто-то использует. Или ему ПОЗВОЛЕНО использовать это в проекте. В моей практике, LINQ как появился, так сразу и ушёл с отпечатком подошвы на *опе, ибо «ненужно». В коде используем исключительно цепочки вызовов, типа Where, Select, Last и т.п.

Кроме того, в шарпе ЕМНИП даже goto разрешен.

Более того - я его использую в коде! Увы, это единственный костыль, позволяющий красиво выйти из вложенных циклов.
Кстати, клеймить goto - первый признак школоты. От того, что кто-то не умеет его использовать, не делает goto хуже любого другого оператора. Плохой код - это код ЧЕЛОВЕКА, а не языка.

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

Кстати, клеймить goto - первый признак школоты. От того, что кто-то не умеет его использовать, не делает goto хуже любого другого оператора. Плохой код - это код ЧЕЛОВЕКА, а не языка.

Так, стоп, по-моему тут какое-то противоречие. Сначала

Просто умри, но код на этом языке должен читаться, модифицироваться, быть совместимым, легко переносимым (реюзабельным, слабо связанным), и т.п.

Потом

Плохой код - это код ЧЕЛОВЕКА, а не языка.

Как это понимать?

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

То же самое я могу сказать например про ANSI C

Ну тык!! Потому сишарп и взял синтаксис «си-подобный», что дюже выразительно и удобно! Но сам Си с его занудными malloc'ами - прошлый век.

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

Кстати, клеймить goto - первый признак школоты. От того, что кто-то не умеет его использовать, не делает goto хуже любого другого оператора. Плохой код - это код ЧЕЛОВЕКА, а не языка.

Кстати, я сам сишник/ассемблершик, и не считаю goto чем-то плохим, но то, что ты пишешь, это как-то противоречиво. Сначала заявлять что «Просто умри, но код на этом языке должен читаться» потом «Плохой код - это код ЧЕЛОВЕКА, а не языка.». Может быть читаемость (качество) кода зависит скорее от человека, пишущего его, чем от языка? Например, на чистом Си тоже можно писать вполне читаемо. Ну а написать нечитаемый код можно вообще на чем угодно, и никакой, даже самый совершенный язык, не спасет от этого. (наоборот кстати неверно: написать читаемый код например на брейнфаке невозможно)

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

Да так и понимать: то, что ты накодил, состоит наполовину из выразительных средств языка, а наполовину - из того, насколько ты квалифицирован. Можно на PHP писать как профи, но язык всё равно останется г***ном. Можно взять C#, но накодить лапши - это уже твой фэйл.

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

Может быть читаемость (качество) кода зависит скорее от человека, пишущего его, чем от языка?

Не смешивай качество и читаемость. Это раз. Второе - язык принимает не последнее участие в качестве. Потому никто и не остановился на Си, что его возможности по контролю качества были НИКАКИЕ. Сейчас эту роль на себя взял Ди.

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

Потому никто и не остановился на Си

Разработчики драйверов и ядер операционных систем на нем и остановились, прекрасно себя чувствуют :)

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

общелисп

Ну что за мода переводить наполовину. Общешепелявый, же.

anonymous
()

Ненадом Ракоцевичем

Ненадо сделал Нинужно.

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

У меня написанного кода - 2 миллиона строк, которые мне (пока) не окупились, но уже вышли в 500,000 штук зелёных.
...
Если ты сейчас не ржёшь над этим новатором-идиотом,

ржать надо скорее вот над этим бизнесменом, а не новатором

впрочем, новации, не учитывающие кодобазу, тоже малополезны

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

Именно это и называю

так что «это»? изоморфизм или функциональное соответствие?

з.ы. скажу честно: мне этот термин не нравится, в т.ч. из-за его размытости

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

Это сейчас не модно, не стильно и не молодежно. Сейчас модно городить нейросети (а тут бы следовало задать целевую функцию и бла-бла-бла). Вот это бы прекрасно подалось бы в том же СМИ или где-то там еще. Но есть языки которые могут частично или полностью компилироваться в нейросети (ака дифференцируемое программирование) и так модифицироваться потом и прочее, но это другая тема.

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

Если ты сейчас не ржёшь над этим новатором-идиотом, ты НИЧЕГО не понимаешь в бизнесе.

А потом внезапно приходит команда конкурентов, которая запиливает аналогичный продукт на современном языке (в 5 раз быстрее и 5 раз дешевле), а не на говне мамонта, на котором сидит «босс».

И босса встречает новый друг - инфаркт, а точнее банкротство.

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

Есть и проблемы другого рода, например если (+ a b c d) и с флоатами это будет вычисляться как (+ a (+ b (+ c d))) а с даблами как (+ (+ (+ a b) c) d) то это будет не очень хорошо

такое поведение это вообще баг (языка?)

более интересно подумать над тем, что компилятор имеет право переставлять в сумме int-ы и не имеет право то же делать с float-ами

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

Нужно и то, и другое. Но в первую очередь я имею ввиду именно изоморфизм

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

например, язык может иметь две полностью равноценные формы для выражения идеи программиста:

if (x<y) do_something(a, b, c);

do_something(a, b, c) when x<y;

которые десахаризуются скажем в (if_then (< x y) (do_something a b c))

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

например, язык может иметь две полностью равноценные формы для выражения идеи программиста:

Эмм, и смысл какой в этом?

SZT ★★★★★
()

Кстати

малый размер исполняемых файлов (при отсутствии внешних зависимостей)

не такой уж и малый. Хеловорд на red немногим меньше хеловорда на Go ))

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

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

че, правда можешь?

а напиши тогда функцию compose

typedef int (*function)(int);

function compose( function f, function g ) /* возвращает такую функцию h, что h(x) = f(g(x)) */
{
    return что??? 
}
www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

Я б сделал

void *ptr = mmap(0, sizeof(somecode),PROT_EXEC | PROT_WRITE | PROT_READ, MAP_ANON | MAP_PRIVATE, -1, 0);

и потом бы по адресу ptr записал бы в машинном коде код некоей функции, которая бы именно это и делала, подставив туда адреса function f, function g, потом кастанул бы ptr в нужный тип и вернул бы

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

Да, можно это сделать еще каким-нибудь дурацким способом, например нагенерировать сишного кода, потом execv("/usr/bin/gcc ... из этого кода сделал бы .so и потом dlopen, dlsym и вернуть

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

что же у вас там за условия такие, что просто не вариант продавить еще что-нибудь, окромя сисярпа?

промышленное программирование.

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

Эмм, и смысл какой в этом?

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

хороший юз кейс второй формы — это чейнинг справа, например

do_something(a, x, y) when x<y for_each x in xx, y in yy;

ну а для первой формы это чейнинг слева (т.е. обычный стиль написания управляющих структур в т.ч. на си), когда кода много и в 1 строку его не написать

foreach( x in xx, y in yy )
{
    if( x<y )
    {
        do_something(a, x, y);
        /*много кода*/
        /*много кода*/
        /*много кода*/
        /*много кода*/
    }
}
www_linux_org_ru ★★★★★
()
Ответ на: комментарий от SZT

Да, можно это сделать еще каким-нибудь дурацким способом, например нагенерировать сишного кода, потом execv(«/usr/bin/gcc ... из этого кода сделал бы .so и потом dlopen, dlsym и вернуть

это ж дико неэффективно будет, особенно если мы делаем это в цикле; и эффективная реализация за несколько секунд может насоздавать, попользовать и уничтожить столько функций, что все вместе их кодовые сегменты просто в оперативку не влезут

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

и потом бы по адресу ptr записал бы в машинном коде код некоей функции

в машинном коде

гм... но это уже не си

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

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

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

Для однородности. Вообще, если по хорошему, любой цикл реализуется через 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 ★★★★★
()
Последнее исправление: SZT (всего исправлений: 2)
Ответ на: комментарий от SZT

Эмм, и смысл какой в этом?

а еще я приведу другой пример: лисп с макросами получается не-гомоиконным

в лиспе возможно как (if (< x y) (f1 a b) (f2 c d)) так и (cond ((< x y) (f1 a b)) (T (f2 c d))); первое выражение может быть макросом и раскрываться во второе, причем скорее всего даже и должно быть именно так, так как в стандарте common lisp емнип нету if, а есть только cond

и какой смысл говорить о лиспе без макросов?

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

первое выражение может быть макросом и раскрываться во второе

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

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

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

ага, отсюда снова видно, почему мне это слово не нравится

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

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

а как будет выглядеть парсер, приближенный к настоящему?

Вот парсер json: https://github.com/red/community/blob/master/parse/JSON.red

короче: им хтмл таки можно парсить, или еще нет?

Можно парсить все что укладывается в peg-грамматику. У html грамматика довольно простая

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

Для однородности.

я не уверен, что одну из этих форм (когда они короткие, как я их написал в первый раз) *обязательно* надо запретить даже на уровне style guide-а, что уж говорить о языке

но запрет на уровне style guide-а является осмысленным

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

В стандарте есть http://l1sp.org/cl/if

вдобавок к тому, что я невнятно сформулировал свою мысль, я перепутал if и cond — а самое забавное то, что перед тем, как написать, я именно эту страничку (по длинной ссылке) и посмотрел

автор этим хотел сказать вот что я хотел сказать:

а еще я приведу другой пример: лисп с макросами получается не-гомоиконным

в лиспе возможно как (cond ((< x y) (f1 a b)) (T (f2 c d))) так и (if (< x y) (f1 a b) (f2 c d)); первое выражение может быть макросом и раскрываться во второе, причем скорее всего даже и должно быть именно так, так как в стандарте common lisp емнип среди специальных форм нету cond, а есть только if

и какой смысл говорить о лиспе без макросов?

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

а еще я небрежно говорю special form вместо special operator, но надеюсь хотя бы сейчас мысль стала ясна

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

разве твоя грамматика правильно распарсит вот такой вот файл, который читабелен в фаерфоксе и хроме?

<html>
<body>
<img src="picture1.jpg" alt="<title>">тут точно не тайтл<img src="picture2.jpg" alt="</title>">
<br>
<img src="picture1.jpg" alt="<u>">тут точно не подчеркнуто<img src="picture2.jpg" alt="</u>">
<br>
<u>а тут подчеркнуто</u>
</body>
</html>
www_linux_org_ru ★★★★★
()
Ответ на: комментарий от matumba

Здесь не вопрос «продавить» (типичный взгляд студоты), здесь вопрос А ЗАЧЕМ?

Тут 2 варианта: либо DLang - неготовое в прод говно и его не стоит продвигать для использования в продакшен, либо ненужное не имеющее никаких приемуществ по части тех.характеристик.

Прочёл? А теперь посади себя в кресло босса, поставь перед собой нанятого очкарика-авангардиста и послушай его

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

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

Если ты сейчас не ржёшь над этим новатором-идиотом, ты НИЧЕГО не понимаешь в бизнесе. Здесь не вопрос «продавить» (типичный взгляд студоты), здесь вопрос А ЗАЧЕМ?

С описанного тобой парнишы я по-улыбался, но не ржал. А вот с тебя достаточно неслабо поржал.

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

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

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

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

промышленное программирование.

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

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

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

Потребовалось немного разминки, но вот смотри:

https://gist.github.com/maximvl/c6335b52ac3a4ee1d780afbf3da636c4

>> do https://gist.githubusercontent.com/maximvl/c6335b52ac3a4ee1d780afbf3da636c4/raw/f7a6b756c72c6a4c06a1c1531fcb874c8534779c/html-parser.red
html
html body
html body img
html body
html body img
html body
html body img
html body
html body img
html body
html body u
html body
html

true
== true

Пришлось добавить правила парсинга внутренностий тега - имени и параметров чтобы текст в кавычках не считался за теги, насколько я понимаю это был твой главный посыл. Я немного изменил твой пример чтобы одиночные теги закрывались правильно, их поддержку тоже несложно добавить - нужно захардкодить множество имен тегово у которых закрывающий не обязателен, так же легко добавить и автозакрывание «<tag/>».

Осталось добавить сохранение тегов в дереве (в примере у меня простой стек) и проверку на то что закрывается правильный тег и все, готово. Это возможно и реализовано в этом парсере: https://github.com/rebolek/red-tools/blob/xml/xml-lite.red

loz ★★★★★
()

Ненадом Ракоцевичем

Ненадом Ненужночем)

Nefalius
()
Ответ на: комментарий от loz

Осталось добавить сохранение тегов в дереве

не-не-не, не надо (потому что дерево это куда более сложная задача — тэги могут перекрываться); я попозже подробно напишу, что же я хотел спросить — кратко вот:

1. (ты видимо это сделал) как во *время разбора* пользоваться какими-то структурами данных, которые я раньше назвал «контекст» (именно это не умеют регекспы; перл дает возможность вставлять в регекспы свой код, но это выглядит ужасно и емнип эта фича экспериментальная до сих пор)

2. как в язык parse (это по факту dsl) добавить свой модификатор — т.е. чтобы для конкретной новой задачи не патчить весь парсер, а воспользоваться определенным ранее модификатором, который проверяет контекст; например «мы_находимся_внутри_текста» (т.е. не внутри атрибута и не внутри кода <script>), «мы_находимся_внутри_тэга_style» — можешь придумать любой по своему вкусу или как удобнее реализовывать в рамках твоего кода

п. 2 зависит от языка и показывает выразительную силу языка (т.е. возможности языка red по построению dsl), вот он как раз уместен в теме про этот язык

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

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 6)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.