Комментарии 47
Какая выгода от этого?
0
А какая выгода от лямбда-выражений?
0
Можно, к примеру, сделать движок для создания простецких сайтов. Взять HTML и усовершенствовать функционалом include'ов и прочего, к примеру. А потом бац, запустили скрипт - сайт сгенерировался (и можно еще чтоб сам обновлялся дописать чтоб полностью не перезаливать).
И тогда небольшие сайты из нескольких страниц станет делать в дальнейшем легче и веселее :-)
+ они не будут сервак всякими там пхпами грузить.
И тогда небольшие сайты из нескольких страниц станет делать в дальнейшем легче и веселее :-)
+ они не будут сервак всякими там пхпами грузить.
+3
это абстрактная программа? иначе какой ее смысл ?
0
Я думаю, что рано или поздно вам придётся написать полноценный парсер PHP. Подумайте, что сделает ваш обработчик лямбда-выражений со следующей строкой:
echo "`What a curious feeling!' said Alice; `I must be shutting up like a telescope.'";
Для того, чтобы распознать, что в этом случае выражение находится в строке, нужно распознать начало строки. А ведь начало строки это не просто " или ', они тоже бывают в строках, экранированные... Так проблемы цепляются одна за другую как снежный ком и придётся писать полноценный парсер.
echo "`What a curious feeling!' said Alice; `I must be shutting up like a telescope.'";
Для того, чтобы распознать, что в этом случае выражение находится в строке, нужно распознать начало строки. А ведь начало строки это не просто " или ', они тоже бывают в строках, экранированные... Так проблемы цепляются одна за другую как снежный ком и придётся писать полноценный парсер.
0
Это не решение. Это эксперимент. Я написал в конце статьи что по-хорошему надо использовать парсер, но в качестве эксперимента такой подход вполне подойдет, вы не согласны?
0
Согласен. Для практического применения могу порекомендовать взять обычный препроцессор C (например cpp из gcc) и посмотреть на библиотеки Boost, там сделаны очень интересные вещи при помощи одного только препроцессора. Ещё можно посмотреть на m4, очень мощный макропроцессор.
0
Думаю, не зря в C препроцессор встроили. Встроить его в PHP совсем не так сложно как кажется.
0
Уже всё встроили. Пишем исходники в файлы .phpm и используем вот такое правило для make:
%.php: %.phpm
$(CPP) -x c -P $< -o $@
0
Очень занятно) Но, думаю, мои статьи о кодогенерации не ограничатся препроцессингом)
0
Ещё раз советую вам, хотя бы поверхностно просмотрите документацию m4 (действительно, очень мощный, на нём сделан autoconf а это все скрипты configure, к которым мы так привыкли) и библиотеки Boost для препроцессора Си. Скорее всего, там будет вся нужная вам функциональность.
У вас есть идея, отлично. Но ваш подход страдает. Для того, чтобы реализовать, казалось бы, простейшую подстановку текста (пример из статьи), оказывается, нужно хотя бы знать, где в файле с исходным кодом находятся строки в кавычках. А с усложнением добавляемого синтаксиса потребуется знать о файле исходника гораздо больше и это будет очень-очень сложно сделать при помощи простых строковых функций типа strpos() и substr(). Вам следовало бы почитать несколько книжек о том, как писать компиляторы. Для тех задач, которые вы ставите перед собой, это просто необходимо, иначе вскоре такой препроцессор превратится в большую пачку этих str*() в которых вы сами не разберётесь уже через месяц после того, как написали.
(Да, я помню, это эксперимент. Но эксперименты должны всё-таки служить накоплению знаний/навыков, необходимых для "настоящей работы").
У вас есть идея, отлично. Но ваш подход страдает. Для того, чтобы реализовать, казалось бы, простейшую подстановку текста (пример из статьи), оказывается, нужно хотя бы знать, где в файле с исходным кодом находятся строки в кавычках. А с усложнением добавляемого синтаксиса потребуется знать о файле исходника гораздо больше и это будет очень-очень сложно сделать при помощи простых строковых функций типа strpos() и substr(). Вам следовало бы почитать несколько книжек о том, как писать компиляторы. Для тех задач, которые вы ставите перед собой, это просто необходимо, иначе вскоре такой препроцессор превратится в большую пачку этих str*() в которых вы сами не разберётесь уже через месяц после того, как написали.
(Да, я помню, это эксперимент. Но эксперименты должны всё-таки служить накоплению знаний/навыков, необходимых для "настоящей работы").
0
Как сейчас помню, в мане по cpp написано, что не стоит использовать его для чего-то кроме C. И они правы.
0
Автору спасибо. Значит таки в хорошем русле двигаетесь :-)
0
Что-то я не очень понимаю. Мне кажется подобные "эксперименты" разумно ставить используя lex + bison, и, соответственно, на gnu Си.
0
Идея препроцессора PHP, написанного на PHP мне тоже когда-то приходила в мою светлую голову. Сам не доводил ее до хоть какого-то майлстоуна - терял к ней интерес, т.к. свободное время всегда хотелось проводить за более здоровыми занятиями -)
А мысли были совершенно разные - от ввода неймспейсов в PHP до интеграции языка с SQL-выраженями, выполняющими простые запросы к CSV-файлам.
Автору респект за проведенный эксперимент! Наш инструмент разработки в наших руках, что позволяет буквально каждому вносить в него полезные изменения и делиться ими со стаждущей общественностью ;-)
А мысли были совершенно разные - от ввода неймспейсов в PHP до интеграции языка с SQL-выраженями, выполняющими простые запросы к CSV-файлам.
Автору респект за проведенный эксперимент! Наш инструмент разработки в наших руках, что позволяет буквально каждому вносить в него полезные изменения и делиться ими со стаждущей общественностью ;-)
+1
Одна небольшая поправка
> Я не использую символ ` (он реализует упрощенный доступ к функции eval)
Обратные кавычки - это shell_exec, а не eval
> Я не использую символ ` (он реализует упрощенный доступ к функции eval)
Обратные кавычки - это shell_exec, а не eval
0
Идея хорошая, пример неудачный, IMHO.
0
Кодогенерация на препроцессоре HTML... В результате полученный код будет так же невозможно отлаживать, как то, что "компилируют" смарти (если не брать smarty console в расчёт).
-2
Мне кажется, что совсем наоборот) Можно кодогенерировать в режиме DEBUG и в общем режиме, можно дописывать нужные конструкции и символы в зависимости от условий) Все зависит от идеи и прямоты рук)
0
Вы хоть раз видели код, который производит Smarty или PHPaspect?
0
Но в Smarty вы работаете не со сгенерированным кодом, а с исходным шаблоном. Данная статья примерно о том же)
0
Да, однако в случае ошибки в исходном шаблоне практически невозможно понять, в каком месте исходного шаблона допущена ошибка, так как сообщения PHP говорят о странных ошибках в странных и ужасных сгенерированных файлах, которые ничего общего не имеют с моим красивым исходным кодом.
Моё мнение таково: если вам нужна кодогенерация, то вы, скорее всего, выбрали неправильный язык для своих задач. В Ruby или Java есть возможность построения DSL Domain Specific Language. На мой взгляд, этот подход гораздо более продуктивен, нежели кодогенерация.
Моё мнение таково: если вам нужна кодогенерация, то вы, скорее всего, выбрали неправильный язык для своих задач. В Ruby или Java есть возможность построения DSL Domain Specific Language. На мой взгляд, этот подход гораздо более продуктивен, нежели кодогенерация.
0
Ошибочно считать PHP просто препроцессором HTML. Да, это местами глючный и корявый язык, но это язык. На PHP можно писать демоны, shell-скрипты, приложения с графическим интерфейсом Qt - да что угодно.
Сделать хороший дебаг в интерпретаторе или компиляторе на PHP возможно, используя эксепшны - это всего лишь вопрос проектирования, надо оно вам или нет, но отнюдь не ограничение среды разработки.
Сделать хороший дебаг в интерпретаторе или компиляторе на PHP возможно, используя эксепшны - это всего лишь вопрос проектирования, надо оно вам или нет, но отнюдь не ограничение среды разработки.
0
Кому вы это рассказываете?) Можно-то много чего, только смысла в этом всём мало. Шелл-скрипты я ещё понимаю, а вот демоны и GUI на qt/gtk - уже нет. Кстати, попробуйте отловить простейший варнинг с помощью try-catch.
0
Да я не сомневаюсь в Вашей компетенции ;-)
Для отлова обычных ошибок внутри try-catch я стал бы использовать свой обработчик ошибок, заданный функцией set_error_handler()
Обработчик может ловить ошибку и вываливать исключение.
Насчет того, ради чего стоит использовать PHP, а ради чего нет - согласен, всему есть своя область применения. Никому ж не придет в голову написать, скажем, принт-сервер на Javascript, хотя, может быть, это и возможно. Я писал про разные возможности применения PHP просто, чтобы проиллюстрировать свое мнение, что PHP это довольно сильный инструмент для разработки.
Для отлова обычных ошибок внутри try-catch я стал бы использовать свой обработчик ошибок, заданный функцией set_error_handler()
Обработчик может ловить ошибку и вываливать исключение.
Насчет того, ради чего стоит использовать PHP, а ради чего нет - согласен, всему есть своя область применения. Никому ж не придет в голову написать, скажем, принт-сервер на Javascript, хотя, может быть, это и возможно. Я писал про разные возможности применения PHP просто, чтобы проиллюстрировать свое мнение, что PHP это довольно сильный инструмент для разработки.
0
Мне вот почему-то кажется, что необходимость set_error_handler() нарушает замечательную концепцию эксепшенов...
0
Естественное расширение:
реализация метода
require_compiled(src);
Который проверяет, что скомпилированный вариант актуален (если нет, компилирует), и затем включает компилированный вариант.
Надо продумать два пункта:
1. параллельный доступ к этой функции.
2. возможно, потребуется говорить PHP-акселераторам насчёт сброса кэша.
реализация метода
require_compiled(src);
Который проверяет, что скомпилированный вариант актуален (если нет, компилирует), и затем включает компилированный вариант.
Надо продумать два пункта:
1. параллельный доступ к этой функции.
2. возможно, потребуется говорить PHP-акселераторам насчёт сброса кэша.
0
По поводу функций для работы с файловой системой: "Изобретаем велосипед".
http://phing.info/trac/wiki/WikiStart
Добавте сюда XSL (XSLT, XPath ... ) и будет вам счастье.
Но статьи такого плана нужны. Пока не сделаешь своё, не научишся пользоваться чужим.
http://phing.info/trac/wiki/WikiStart
Добавте сюда XSL (XSLT, XPath ... ) и будет вам счастье.
Но статьи такого плана нужны. Пока не сделаешь своё, не научишся пользоваться чужим.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Публикации
Изменить настройки темы
Практическое применение